Skip to content

Commit 7fde991

Browse files
committed
Refactor imap_mail()'s internal implementation to use zend_strings
1 parent 73631e5 commit 7fde991

File tree

1 file changed

+55
-52
lines changed

1 file changed

+55
-52
lines changed

ext/imap/php_imap.c

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,7 +3411,8 @@ PHP_FUNCTION(imap_mail_compose)
34113411
/* }}} */
34123412

34133413
/* {{{ _php_imap_mail */
3414-
int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *cc, char *bcc, char* rpath)
3414+
bool _php_imap_mail(zend_string *to, zend_string *subject, zend_string *message, zend_string *headers,
3415+
zend_string *cc, zend_string *bcc, zend_string* rpath)
34153416
{
34163417
#ifdef PHP_WIN32
34173418
int tsm_err;
@@ -3420,6 +3421,9 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
34203421
int ret;
34213422
#endif
34223423

3424+
ZEND_ASSERT(to && ZSTR_LEN(to) != 0);
3425+
ZEND_ASSERT(subject && ZSTR_LEN(subject) != 0);
3426+
34233427
#ifdef PHP_WIN32
34243428
char *tempMailTo;
34253429
char *tsm_errmsg = NULL;
@@ -3428,56 +3432,55 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
34283432
size_t offset, bufferLen = 0;
34293433
size_t bt_len;
34303434

3435+
/* Add "To" field's necessary buffer length */
3436+
bufferLen += ZSTR_LEN(to) + 6;
34313437
if (headers) {
3432-
bufferLen += strlen(headers);
3433-
}
3434-
if (to) {
3435-
bufferLen += strlen(to) + 6;
3438+
bufferLen += ZSTR_LEN(headers);
34363439
}
34373440
if (cc) {
3438-
bufferLen += strlen(cc) + 6;
3441+
bufferLen += ZSTR_LEN(cc) + 6;
34393442
}
34403443

34413444
#define PHP_IMAP_CLEAN if (bufferTo) efree(bufferTo); if (bufferCc) efree(bufferCc); if (bufferBcc) efree(bufferBcc); if (bufferHeader) efree(bufferHeader);
34423445
#define PHP_IMAP_BAD_DEST PHP_IMAP_CLEAN; efree(tempMailTo); return (BAD_MSG_DESTINATION);
34433446

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

3475-
if (cc && *cc) {
3478+
if (cc && ZSTR_LEN(cc) != 0) {
34763479
strlcat(bufferHeader, "Cc: ", bufferLen + 1);
3477-
strlcat(bufferHeader, cc, bufferLen + 1);
3480+
strlcat(bufferHeader, ZSTR_VAL(cc), bufferLen + 1);
34783481
strlcat(bufferHeader, "\r\n", bufferLen + 1);
3479-
tempMailTo = estrdup(cc);
3480-
bt_len = strlen(cc);
3482+
tempMailTo = estrdup(ZSTR_VAL(cc));
3483+
bt_len = ZSTR_LEN(cc);
34813484
bufferCc = (char *)safe_emalloc(bt_len, 1, 1);
34823485
bt_len++;
34833486
offset = 0;
@@ -3501,9 +3504,9 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
35013504
}
35023505
}
35033506

3504-
if (bcc && *bcc) {
3505-
tempMailTo = estrdup(bcc);
3506-
bt_len = strlen(bcc);
3507+
if (bcc && ZSTR_LEN(bcc)) {
3508+
tempMailTo = estrdup(ZSTR_VAL(bcc));
3509+
bt_len = ZSTR_LEN(bcc);
35073510
bufferBcc = (char *)safe_emalloc(bt_len, 1, 1);
35083511
bt_len++;
35093512
offset = 0;
@@ -3527,11 +3530,12 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
35273530
}
35283531
}
35293532

3530-
if (headers && *headers) {
3531-
strlcat(bufferHeader, headers, bufferLen + 1);
3533+
if (headers && ZSTR_LEN(headers)) {
3534+
strlcat(bufferHeader, ZSTR_VAL(headers), bufferLen + 1);
35323535
}
35333536

3534-
if (TSendMail(INI_STR("SMTP"), &tsm_err, &tsm_errmsg, bufferHeader, subject, bufferTo, message, bufferCc, bufferBcc, rpath) != SUCCESS) {
3537+
if (TSendMail(INI_STR("SMTP"), &tsm_err, &tsm_errmsg, bufferHeader, ZSTR_VAL(subject),
3538+
bufferTo, ZSTR_VAL(message), bufferCc, bufferBcc, ZSTR_VAL(rpath)) != SUCCESS) {
35353539
if (tsm_errmsg) {
35363540
php_error_docref(NULL, E_WARNING, "%s", tsm_errmsg);
35373541
efree(tsm_errmsg);
@@ -3548,15 +3552,15 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
35483552
}
35493553
sendmail = popen(INI_STR("sendmail_path"), "w");
35503554
if (sendmail) {
3551-
if (rpath && rpath[0]) fprintf(sendmail, "From: %s\n", rpath);
3552-
fprintf(sendmail, "To: %s\n", to);
3553-
if (cc && cc[0]) fprintf(sendmail, "Cc: %s\n", cc);
3554-
if (bcc && bcc[0]) fprintf(sendmail, "Bcc: %s\n", bcc);
3555-
fprintf(sendmail, "Subject: %s\n", subject);
3555+
if (ZSTR_LEN(rpath) != 0) fprintf(sendmail, "From: %s\n", ZSTR_VAL(rpath));
3556+
fprintf(sendmail, "To: %s\n", ZSTR_VAL(to));
3557+
if (ZSTR_LEN(cc) != 0) fprintf(sendmail, "Cc: %s\n", ZSTR_VAL(cc));
3558+
if (ZSTR_LEN(bcc) != 0) fprintf(sendmail, "Bcc: %s\n", ZSTR_VAL(bcc));
3559+
fprintf(sendmail, "Subject: %s\n", ZSTR_VAL(subject));
35563560
if (headers != NULL) {
3557-
fprintf(sendmail, "%s\n", headers);
3561+
fprintf(sendmail, "%s\n", ZSTR_VAL(headers));
35583562
}
3559-
fprintf(sendmail, "\n%s\n", message);
3563+
fprintf(sendmail, "\n%s\n", ZSTR_VAL(message));
35603564
ret = pclose(sendmail);
35613565

35623566
return ret != -1;
@@ -3575,7 +3579,7 @@ PHP_FUNCTION(imap_mail)
35753579
zend_string *to=NULL, *message=NULL, *headers=NULL, *subject=NULL, *cc=NULL, *bcc=NULL, *rpath=NULL;
35763580
int argc = ZEND_NUM_ARGS();
35773581

3578-
if (zend_parse_parameters(argc, "SSS|SSSS", &to, &subject, &message,
3582+
if (zend_parse_parameters(argc, "PPP|PPPP", &to, &subject, &message,
35793583
&headers, &cc, &bcc, &rpath) == FAILURE) {
35803584
RETURN_THROWS();
35813585
}
@@ -3598,8 +3602,7 @@ PHP_FUNCTION(imap_mail)
35983602
php_error_docref(NULL, E_WARNING, "No message string in mail command");
35993603
}
36003604

3601-
if (_php_imap_mail(ZSTR_VAL(to), ZSTR_VAL(subject), ZSTR_VAL(message), headers?ZSTR_VAL(headers):NULL, cc?ZSTR_VAL(cc):NULL,
3602-
bcc?ZSTR_VAL(bcc):NULL, rpath?ZSTR_VAL(rpath):NULL)) {
3605+
if (_php_imap_mail(to, subject, message, headers, cc, bcc, rpath)) {
36033606
RETURN_TRUE;
36043607
} else {
36053608
RETURN_FALSE;

0 commit comments

Comments
 (0)