@@ -333,6 +333,37 @@ PHPAPI char *GetSMErrorText(int index)
333
333
}
334
334
}
335
335
336
+ /* strtok_r like, but recognizes quoted-strings */
337
+ static char * find_address (char * list , char * * state )
338
+ {
339
+ zend_bool in_quotes = 0 ;
340
+ char * p = list ;
341
+
342
+ if (list == NULL ) {
343
+ if (* state == NULL ) {
344
+ return NULL ;
345
+ }
346
+ p = list = * state ;
347
+ }
348
+ * state = NULL ;
349
+ while ((p = strpbrk (p , ",\"\\" )) != NULL ) {
350
+ if (* p == '\\' && in_quotes ) {
351
+ if (p [1 ] == '\0' ) {
352
+ /* invalid address; let SMTP server deal with it */
353
+ break ;
354
+ }
355
+ p ++ ;
356
+ } else if (* p == '"' ) {
357
+ in_quotes = !in_quotes ;
358
+ } else if (* p == ',' && !in_quotes ) {
359
+ * p = '\0' ;
360
+ * state = p + 1 ;
361
+ break ;
362
+ }
363
+ p ++ ;
364
+ }
365
+ return list ;
366
+ }
336
367
337
368
/*********************************************************************
338
369
// Name: SendText
@@ -357,7 +388,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
357
388
{
358
389
int res ;
359
390
char * p ;
360
- char * tempMailTo , * token , * pos1 , * pos2 ;
391
+ char * tempMailTo , * token , * token_state , * pos1 , * pos2 ;
361
392
char * server_response = NULL ;
362
393
char * stripped_header = NULL ;
363
394
zend_string * data_cln ;
@@ -410,7 +441,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
410
441
411
442
tempMailTo = estrdup (mailTo );
412
443
/* Send mail to all rcpt's */
413
- token = strtok (tempMailTo , "," );
444
+ token = find_address (tempMailTo , & token_state );
414
445
while (token != NULL )
415
446
{
416
447
SMTP_SKIP_SPACE (token );
@@ -424,14 +455,14 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
424
455
efree (tempMailTo );
425
456
return (res );
426
457
}
427
- token = strtok (NULL , "," );
458
+ token = find_address (NULL , & token_state );
428
459
}
429
460
efree (tempMailTo );
430
461
431
462
if (mailCc && * mailCc ) {
432
463
tempMailTo = estrdup (mailCc );
433
464
/* Send mail to all rcpt's */
434
- token = strtok (tempMailTo , "," );
465
+ token = find_address (tempMailTo , & token_state );
435
466
while (token != NULL )
436
467
{
437
468
SMTP_SKIP_SPACE (token );
@@ -445,7 +476,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
445
476
efree (tempMailTo );
446
477
return (res );
447
478
}
448
- token = strtok (NULL , "," );
479
+ token = find_address (NULL , & token_state );
449
480
}
450
481
efree (tempMailTo );
451
482
}
@@ -471,7 +502,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
471
502
tempMailTo = estrndup (pos1 , pos2 - pos1 );
472
503
}
473
504
474
- token = strtok (tempMailTo , "," );
505
+ token = find_address (tempMailTo , & token_state );
475
506
while (token != NULL )
476
507
{
477
508
SMTP_SKIP_SPACE (token );
@@ -485,7 +516,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
485
516
efree (tempMailTo );
486
517
return (res );
487
518
}
488
- token = strtok (NULL , "," );
519
+ token = find_address (NULL ,& token_state );
489
520
}
490
521
efree (tempMailTo );
491
522
}
@@ -496,7 +527,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
496
527
if (mailBcc && * mailBcc ) {
497
528
tempMailTo = estrdup (mailBcc );
498
529
/* Send mail to all rcpt's */
499
- token = strtok (tempMailTo , "," );
530
+ token = find_address (tempMailTo , & token_state );
500
531
while (token != NULL )
501
532
{
502
533
SMTP_SKIP_SPACE (token );
@@ -510,7 +541,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
510
541
efree (tempMailTo );
511
542
return (res );
512
543
}
513
- token = strtok (NULL , "," );
544
+ token = find_address (NULL , & token_state );
514
545
}
515
546
efree (tempMailTo );
516
547
}
@@ -544,7 +575,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
544
575
}
545
576
}
546
577
547
- token = strtok (tempMailTo , "," );
578
+ token = find_address (tempMailTo , & token_state );
548
579
while (token != NULL )
549
580
{
550
581
SMTP_SKIP_SPACE (token );
@@ -558,7 +589,7 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char
558
589
efree (tempMailTo );
559
590
return (res );
560
591
}
561
- token = strtok (NULL , "," );
592
+ token = find_address (NULL , & token_state );
562
593
}
563
594
efree (tempMailTo );
564
595
@@ -978,6 +1009,46 @@ static unsigned long GetAddr(LPSTR szHost)
978
1009
return (lAddr );
979
1010
} /* end GetAddr() */
980
1011
1012
+ /* returns the contents of an angle-addr (caller needs to efree) or NULL */
1013
+ static char * get_angle_addr (char * address )
1014
+ {
1015
+ zend_bool in_quotes = 0 ;
1016
+ char * p1 = address , * p2 ;
1017
+
1018
+ while ((p1 = strpbrk (p1 , "<\"\\" )) != NULL ) {
1019
+ if (* p1 == '\\' && in_quotes ) {
1020
+ if (p1 [1 ] == '\0' ) {
1021
+ /* invalid address; let SMTP server deal with it */
1022
+ return NULL ;
1023
+ }
1024
+ p1 ++ ;
1025
+ } else if (* p1 == '"' ) {
1026
+ in_quotes = !in_quotes ;
1027
+ } else if (* p1 == '<' && !in_quotes ) {
1028
+ break ;
1029
+ }
1030
+ p1 ++ ;
1031
+ }
1032
+ if (p1 == NULL ) return NULL ;
1033
+ p2 = ++ p1 ;
1034
+ while ((p2 = strpbrk (p2 , ">\"\\" )) != NULL ) {
1035
+ if (* p2 == '\\' && in_quotes ) {
1036
+ if (p2 [1 ] == '\0' ) {
1037
+ /* invalid address; let SMTP server deal with it */
1038
+ return NULL ;
1039
+ }
1040
+ p2 ++ ;
1041
+ } else if (* p2 == '"' ) {
1042
+ in_quotes = !in_quotes ;
1043
+ } else if (* p2 == '>' && !in_quotes ) {
1044
+ break ;
1045
+ }
1046
+ p2 ++ ;
1047
+ }
1048
+ if (p2 == NULL ) return NULL ;
1049
+
1050
+ return estrndup (p1 , p2 - p1 );
1051
+ }
981
1052
982
1053
/*********************************************************************
983
1054
// Name: int FormatEmailAddress
@@ -993,13 +1064,12 @@ static unsigned long GetAddr(LPSTR szHost)
993
1064
// History:
994
1065
//********************************************************************/
995
1066
static int FormatEmailAddress (char * Buf , char * EmailAddress , char * FormatString ) {
996
- char * tmpAddress1 , * tmpAddress2 ;
1067
+ char * tmpAddress ;
997
1068
int result ;
998
1069
999
- if ( (tmpAddress1 = strchr (EmailAddress , '<' )) && (tmpAddress2 = strchr (tmpAddress1 , '>' )) ) {
1000
- * tmpAddress2 = 0 ; // terminate the string temporarily.
1001
- result = snprintf (Buf , MAIL_BUFFER_SIZE , FormatString , tmpAddress1 + 1 );
1002
- * tmpAddress2 = '>' ; // put it back the way it was.
1070
+ if ((tmpAddress = get_angle_addr (EmailAddress )) != NULL ) {
1071
+ result = snprintf (Buf , MAIL_BUFFER_SIZE , FormatString , tmpAddress );
1072
+ efree (tmpAddress );
1003
1073
return result ;
1004
1074
}
1005
1075
return snprintf (Buf , MAIL_BUFFER_SIZE , FormatString , EmailAddress );
0 commit comments