Skip to content

Commit 23dab38

Browse files
committedJan 21, 2023
Use smart_str as dynamic buffer for extra headers in mb_send_mail
1 parent 8a73a68 commit 23dab38

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed
 

‎ext/mbstring/mbstring.c

+33-25
Original file line numberDiff line numberDiff line change
@@ -4160,7 +4160,7 @@ PHP_FUNCTION(mb_send_mail)
41604160
zend_string *extra_cmd = NULL;
41614161
HashTable *headers_ht = NULL;
41624162
zend_string *str_headers = NULL;
4163-
size_t n, i;
4163+
size_t i;
41644164
char *to_r = NULL;
41654165
char *force_extra_parameters = INI_STR("mail.force_extra_parameters");
41664166
struct {
@@ -4175,15 +4175,12 @@ PHP_FUNCTION(mb_send_mail)
41754175
const mbfl_encoding *tran_cs, /* transfer text charset */
41764176
*head_enc, /* header transfer encoding */
41774177
*body_enc; /* body transfer encoding */
4178-
mbfl_memory_device device; /* automatic allocateable buffer for additional header */
41794178
const mbfl_language *lang;
41804179
int err = 0;
41814180
HashTable ht_headers;
41824181
zval *s;
4183-
extern void mbfl_memory_device_unput(mbfl_memory_device *device);
41844182

41854183
/* initialize */
4186-
mbfl_memory_device_init(&device, 0, 0);
41874184
mbfl_string_init(&orig_str);
41884185
mbfl_string_init(&conv_str);
41894186

@@ -4343,47 +4340,59 @@ PHP_FUNCTION(mb_send_mail)
43434340
#define PHP_MBSTR_MAIL_MIME_HEADER2 "Content-Type: text/plain"
43444341
#define PHP_MBSTR_MAIL_MIME_HEADER3 "; charset="
43454342
#define PHP_MBSTR_MAIL_MIME_HEADER4 "Content-Transfer-Encoding: "
4343+
4344+
smart_str str = {0};
4345+
bool empty = true;
4346+
43464347
if (str_headers != NULL) {
4347-
p = ZSTR_VAL(str_headers);
4348-
n = ZSTR_LEN(str_headers);
4349-
mbfl_memory_device_strncat(&device, p, n);
4350-
if (n > 0 && p[n - 1] != '\n') {
4351-
mbfl_memory_device_strncat(&device, line_sep, line_sep_len);
4348+
/* Strip trailing CRLF from `str_headers`; we will add CRLF back if necessary */
4349+
size_t len = ZSTR_LEN(str_headers);
4350+
if (ZSTR_VAL(str_headers)[len-1] == '\n') {
4351+
len--;
4352+
}
4353+
if (ZSTR_VAL(str_headers)[len-1] == '\r') {
4354+
len--;
43524355
}
4356+
smart_str_appendl(&str, ZSTR_VAL(str_headers), len);
4357+
empty = false;
43534358
zend_string_release_ex(str_headers, 0);
43544359
}
43554360

43564361
if (!zend_hash_str_exists(&ht_headers, "mime-version", sizeof("mime-version") - 1)) {
4357-
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER1, sizeof(PHP_MBSTR_MAIL_MIME_HEADER1) - 1);
4358-
mbfl_memory_device_strncat(&device, line_sep, line_sep_len);
4362+
if (!empty) {
4363+
smart_str_appendl(&str, line_sep, line_sep_len);
4364+
}
4365+
smart_str_appendl(&str, PHP_MBSTR_MAIL_MIME_HEADER1, sizeof(PHP_MBSTR_MAIL_MIME_HEADER1) - 1);
4366+
empty = false;
43594367
}
43604368

43614369
if (!suppressed_hdrs.cnt_type) {
4362-
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1);
4370+
if (!empty) {
4371+
smart_str_appendl(&str, line_sep, line_sep_len);
4372+
}
4373+
smart_str_appendl(&str, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1);
43634374

43644375
p = (char *)mbfl_encoding_preferred_mime_name(tran_cs);
43654376
if (p != NULL) {
4366-
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1);
4367-
mbfl_memory_device_strcat(&device, p);
4377+
smart_str_appendl(&str, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1);
4378+
smart_str_appends(&str, p);
43684379
}
4369-
mbfl_memory_device_strncat(&device, line_sep, line_sep_len);
4380+
empty = false;
43704381
}
4382+
43714383
if (!suppressed_hdrs.cnt_trans_enc) {
4372-
mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1);
4384+
if (!empty) {
4385+
smart_str_appendl(&str, line_sep, line_sep_len);
4386+
}
4387+
smart_str_appendl(&str, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1);
43734388
p = (char *)mbfl_encoding_preferred_mime_name(body_enc);
43744389
if (p == NULL) {
43754390
p = "7bit";
43764391
}
4377-
mbfl_memory_device_strcat(&device, p);
4378-
mbfl_memory_device_strncat(&device, line_sep, line_sep_len);
4392+
smart_str_appends(&str, p);
43794393
}
43804394

4381-
if (!PG(mail_mixed_lf_and_crlf)) {
4382-
mbfl_memory_device_unput(&device);
4383-
}
4384-
mbfl_memory_device_unput(&device);
4385-
mbfl_memory_device_output('\0', &device);
4386-
str_headers = zend_string_init((char *)device.buffer, strlen((char *)device.buffer), 0);
4395+
str_headers = smart_str_extract(&str);
43874396

43884397
if (force_extra_parameters) {
43894398
extra_cmd = php_escape_shell_cmd(force_extra_parameters);
@@ -4404,7 +4413,6 @@ PHP_FUNCTION(mb_send_mail)
44044413
efree((void *)subject_buf);
44054414
}
44064415
zend_string_free(conv);
4407-
mbfl_memory_device_clear(&device);
44084416
zend_hash_destroy(&ht_headers);
44094417
if (str_headers) {
44104418
zend_string_release_ex(str_headers, 0);

0 commit comments

Comments
 (0)