Skip to content

Commit 7e0ab1c

Browse files
committed
Fix imap_mail() refactoring on Windows
1 parent 5ba4dca commit 7e0ab1c

File tree

1 file changed

+34
-32
lines changed

1 file changed

+34
-32
lines changed

ext/imap/php_imap.c

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3420,6 +3420,9 @@ bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message,
34203420
int ret;
34213421
#endif
34223422

3423+
ZEND_ASSERT(to && ZSTR_LEN(to) != 0);
3424+
ZEND_ASSERT(subject && ZSTR_LEN(subject) != 0);
3425+
34233426
#ifdef PHP_WIN32
34243427
char *tempMailTo;
34253428
char *tsm_errmsg = NULL;
@@ -3428,12 +3431,11 @@ bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message,
34283431
size_t offset, bufferLen = 0;
34293432
size_t bt_len;
34303433

3434+
/* Add "To" field's necessary buffer length */
3435+
bufferLen += ZSTR_LEN(to) + 6;
34313436
if (headers) {
34323437
bufferLen += ZSTR_LEN(headers);
34333438
}
3434-
if (to) {
3435-
bufferLen += ZSTR_LEN(to) + 6;
3436-
}
34373439
if (cc) {
34383440
bufferLen += ZSTR_LEN(cc) + 6;
34393441
}
@@ -3443,36 +3445,36 @@ bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message,
34433445

34443446
bufferHeader = (char *)safe_emalloc(bufferLen, 1, 1);
34453447
memset(bufferHeader, 0, bufferLen);
3446-
if (to && *to) {
3447-
strlcat(bufferHeader, "To: ", bufferLen + 1);
3448-
strlcat(bufferHeader, ZSTR_VAL(to), bufferLen + 1);
3449-
strlcat(bufferHeader, "\r\n", bufferLen + 1);
3450-
tempMailTo = estrdup(ZSTR_VAL(to));
3451-
bt_len = ZSTR_LEN(to);
3452-
bufferTo = (char *)safe_emalloc(bt_len, 1, 1);
3453-
bt_len++;
3454-
offset = 0;
3455-
addr = NULL;
3456-
rfc822_parse_adrlist(&addr, tempMailTo, "NO HOST");
3457-
while (addr) {
3458-
if (addr->host == NULL || strcmp(addr->host, ERRHOST) == 0) {
3459-
PHP_IMAP_BAD_DEST;
3460-
} else {
3461-
bufferTo = safe_erealloc(bufferTo, bt_len, 1, strlen(addr->mailbox));
3462-
bt_len += strlen(addr->mailbox);
3463-
bufferTo = safe_erealloc(bufferTo, bt_len, 1, strlen(addr->host));
3464-
bt_len += strlen(addr->host);
3465-
offset += slprintf(bufferTo + offset, bt_len - offset, "%s@%s,", addr->mailbox, addr->host);
3466-
}
3467-
addr = addr->next;
3468-
}
3469-
efree(tempMailTo);
3470-
if (offset>0) {
3471-
bufferTo[offset-1] = 0;
3448+
3449+
/* Handle "To" Field */
3450+
strlcat(bufferHeader, "To: ", bufferLen + 1);
3451+
strlcat(bufferHeader, ZSTR_VAL(to), bufferLen + 1);
3452+
strlcat(bufferHeader, "\r\n", bufferLen + 1);
3453+
tempMailTo = estrdup(ZSTR_VAL(to));
3454+
bt_len = ZSTR_LEN(to);
3455+
bufferTo = (char *)safe_emalloc(bt_len, 1, 1);
3456+
bt_len++;
3457+
offset = 0;
3458+
addr = NULL;
3459+
rfc822_parse_adrlist(&addr, tempMailTo, "NO HOST");
3460+
while (addr) {
3461+
if (addr->host == NULL || strcmp(addr->host, ERRHOST) == 0) {
3462+
PHP_IMAP_BAD_DEST;
3463+
} else {
3464+
bufferTo = safe_erealloc(bufferTo, bt_len, 1, strlen(addr->mailbox));
3465+
bt_len += strlen(addr->mailbox);
3466+
bufferTo = safe_erealloc(bufferTo, bt_len, 1, strlen(addr->host));
3467+
bt_len += strlen(addr->host);
3468+
offset += slprintf(bufferTo + offset, bt_len - offset, "%s@%s,", addr->mailbox, addr->host);
34723469
}
3470+
addr = addr->next;
3471+
}
3472+
efree(tempMailTo);
3473+
if (offset>0) {
3474+
bufferTo[offset-1] = 0;
34733475
}
34743476

3475-
if (cc && *cc) {
3477+
if (cc && ZSTR_LEN(cc) != 0) {
34763478
strlcat(bufferHeader, "Cc: ", bufferLen + 1);
34773479
strlcat(bufferHeader, ZSTR_VAL(cc), bufferLen + 1);
34783480
strlcat(bufferHeader, "\r\n", bufferLen + 1);
@@ -3501,7 +3503,7 @@ bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message,
35013503
}
35023504
}
35033505

3504-
if (bcc && *bcc) {
3506+
if (bcc && ZSTR_LEN(bcc)) {
35053507
tempMailTo = estrdup(ZSTR_VAL(bcc));
35063508
bt_len = ZSTR_LEN(bcc);
35073509
bufferBcc = (char *)safe_emalloc(bt_len, 1, 1);
@@ -3527,7 +3529,7 @@ bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message,
35273529
}
35283530
}
35293531

3530-
if (headers && *headers) {
3532+
if (headers && ZSTR_LEN(headers)) {
35313533
strlcat(bufferHeader, ZSTR_VAL(headers), bufferLen + 1);
35323534
}
35333535

0 commit comments

Comments
 (0)