@@ -3411,7 +3411,8 @@ PHP_FUNCTION(imap_mail_compose)
3411
3411
/* }}} */
3412
3412
3413
3413
/* {{{ _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 )
3415
3416
{
3416
3417
#ifdef PHP_WIN32
3417
3418
int tsm_err ;
@@ -3420,6 +3421,9 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
3420
3421
int ret ;
3421
3422
#endif
3422
3423
3424
+ ZEND_ASSERT (to && ZSTR_LEN (to ) != 0 );
3425
+ ZEND_ASSERT (subject && ZSTR_LEN (subject ) != 0 );
3426
+
3423
3427
#ifdef PHP_WIN32
3424
3428
char * tempMailTo ;
3425
3429
char * tsm_errmsg = NULL ;
@@ -3428,56 +3432,55 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
3428
3432
size_t offset , bufferLen = 0 ;
3429
3433
size_t bt_len ;
3430
3434
3435
+ /* Add "To" field's necessary buffer length */
3436
+ bufferLen += ZSTR_LEN (to ) + 6 ;
3431
3437
if (headers ) {
3432
- bufferLen += strlen (headers );
3433
- }
3434
- if (to ) {
3435
- bufferLen += strlen (to ) + 6 ;
3438
+ bufferLen += ZSTR_LEN (headers );
3436
3439
}
3437
3440
if (cc ) {
3438
- bufferLen += strlen (cc ) + 6 ;
3441
+ bufferLen += ZSTR_LEN (cc ) + 6 ;
3439
3442
}
3440
3443
3441
3444
#define PHP_IMAP_CLEAN if (bufferTo) efree(bufferTo); if (bufferCc) efree(bufferCc); if (bufferBcc) efree(bufferBcc); if (bufferHeader) efree(bufferHeader);
3442
3445
#define PHP_IMAP_BAD_DEST PHP_IMAP_CLEAN; efree(tempMailTo); return (BAD_MSG_DESTINATION);
3443
3446
3444
3447
bufferHeader = (char * )safe_emalloc (bufferLen , 1 , 1 );
3445
3448
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 );
3472
3470
}
3471
+ addr = addr -> next ;
3472
+ }
3473
+ efree (tempMailTo );
3474
+ if (offset > 0 ) {
3475
+ bufferTo [offset - 1 ] = 0 ;
3473
3476
}
3474
3477
3475
- if (cc && * cc ) {
3478
+ if (cc && ZSTR_LEN ( cc ) != 0 ) {
3476
3479
strlcat (bufferHeader , "Cc: " , bufferLen + 1 );
3477
- strlcat (bufferHeader , cc , bufferLen + 1 );
3480
+ strlcat (bufferHeader , ZSTR_VAL ( cc ) , bufferLen + 1 );
3478
3481
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 );
3481
3484
bufferCc = (char * )safe_emalloc (bt_len , 1 , 1 );
3482
3485
bt_len ++ ;
3483
3486
offset = 0 ;
@@ -3501,9 +3504,9 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
3501
3504
}
3502
3505
}
3503
3506
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 );
3507
3510
bufferBcc = (char * )safe_emalloc (bt_len , 1 , 1 );
3508
3511
bt_len ++ ;
3509
3512
offset = 0 ;
@@ -3527,11 +3530,12 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
3527
3530
}
3528
3531
}
3529
3532
3530
- if (headers && * headers ) {
3531
- strlcat (bufferHeader , headers , bufferLen + 1 );
3533
+ if (headers && ZSTR_LEN ( headers ) ) {
3534
+ strlcat (bufferHeader , ZSTR_VAL ( headers ) , bufferLen + 1 );
3532
3535
}
3533
3536
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 ) {
3535
3539
if (tsm_errmsg ) {
3536
3540
php_error_docref (NULL , E_WARNING , "%s" , tsm_errmsg );
3537
3541
efree (tsm_errmsg );
@@ -3548,15 +3552,15 @@ int _php_imap_mail(char *to, char *subject, char *message, char *headers, char *
3548
3552
}
3549
3553
sendmail = popen (INI_STR ("sendmail_path" ), "w" );
3550
3554
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 ) );
3556
3560
if (headers != NULL ) {
3557
- fprintf (sendmail , "%s\n" , headers );
3561
+ fprintf (sendmail , "%s\n" , ZSTR_VAL ( headers ) );
3558
3562
}
3559
- fprintf (sendmail , "\n%s\n" , message );
3563
+ fprintf (sendmail , "\n%s\n" , ZSTR_VAL ( message ) );
3560
3564
ret = pclose (sendmail );
3561
3565
3562
3566
return ret != -1 ;
@@ -3575,7 +3579,7 @@ PHP_FUNCTION(imap_mail)
3575
3579
zend_string * to = NULL , * message = NULL , * headers = NULL , * subject = NULL , * cc = NULL , * bcc = NULL , * rpath = NULL ;
3576
3580
int argc = ZEND_NUM_ARGS ();
3577
3581
3578
- if (zend_parse_parameters (argc , "SSS|SSSS " , & to , & subject , & message ,
3582
+ if (zend_parse_parameters (argc , "PPP|PPPP " , & to , & subject , & message ,
3579
3583
& headers , & cc , & bcc , & rpath ) == FAILURE ) {
3580
3584
RETURN_THROWS ();
3581
3585
}
@@ -3598,8 +3602,7 @@ PHP_FUNCTION(imap_mail)
3598
3602
php_error_docref (NULL , E_WARNING , "No message string in mail command" );
3599
3603
}
3600
3604
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 )) {
3603
3606
RETURN_TRUE ;
3604
3607
} else {
3605
3608
RETURN_FALSE ;
0 commit comments