jani            Mon Aug  4 21:13:34 2008 UTC

  Added files:                 
    /php-src/ext/imap/tests     bug45705_1.phpt bug45705_2.phpt 

  Removed files:               
    /php-src/ext/imap/tests     bug45705.phpt 

  Modified files:              
    /php-src/ext/imap   php_imap.c 
  Log:
  - Fixed bug #45705 (rfc822_parse_adrlist() modifies passed address parameter)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/imap/php_imap.c?r1=1.257&r2=1.258&diff_format=u
Index: php-src/ext/imap/php_imap.c
diff -u php-src/ext/imap/php_imap.c:1.257 php-src/ext/imap/php_imap.c:1.258
--- php-src/ext/imap/php_imap.c:1.257   Mon Aug  4 15:34:29 2008
+++ php-src/ext/imap/php_imap.c Mon Aug  4 21:13:33 2008
@@ -26,7 +26,7 @@
    | PHP 4.0 updates:  Zeev Suraski <[EMAIL PROTECTED]>                       |
    +----------------------------------------------------------------------+
  */
-/* $Id: php_imap.c,v 1.257 2008/08/04 15:34:29 jani Exp $ */
+/* $Id: php_imap.c,v 1.258 2008/08/04 21:13:33 jani Exp $ */
 
 #define IMAP41
 
@@ -2512,7 +2512,7 @@
 PHP_FUNCTION(imap_rfc822_parse_adrlist)
 {
        zval *tovals;
-       char *str, *defaulthost;
+       char *str, *defaulthost, *str_copy;
        int str_len, defaulthost_len;
        ADDRESS *addresstmp;
        ENVELOPE *env;
@@ -2523,7 +2523,10 @@
 
        env = mail_newenvelope();
 
-       rfc822_parse_adrlist(&env->to, str, defaulthost);
+       /* rfc822_parse_adrlist() modifies passed string. Copy it. */
+       str_copy = estrndup(str, str_len);
+       rfc822_parse_adrlist(&env->to, str_copy, defaulthost);
+       efree(str_copy);
 
        array_init(return_value);
 
@@ -3292,53 +3295,58 @@
        BODY *bod=NULL, *topbod=NULL;
        PART *mypart=NULL, *part;
        PARAMETER *param, *disp_param = NULL, *custom_headers_param = NULL, 
*tmp_param = NULL;
-       char *tmp=NULL, *mystring=NULL, *t=NULL, *tempstring=NULL;
+       char *tmp=NULL, *mystring=NULL, *t=NULL, *tempstring=NULL, *str_copy = 
NULL;
        int toppart = 0;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &envelope, 
&body) == FAILURE) {
                return;
        }
 
+#define PHP_RFC822_PARSE_ADRLIST(target, value) \
+       str_copy = estrndup(Z_STRVAL_PP(value), Z_STRLEN_PP(value)); \
+       rfc822_parse_adrlist(target, str_copy, "NO HOST"); \
+       efree(str_copy);
+
        env = mail_newenvelope();
        if (zend_hash_find(Z_ARRVAL_P(envelope), "remail", sizeof("remail"), 
(void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               env->remail=cpystr(Z_STRVAL_PP(pvalue));
+               env->remail = cpystr(Z_STRVAL_PP(pvalue));
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "return_path", 
sizeof("return_path"), (void **) &pvalue)== SUCCESS) {
-               convert_to_string_ex(pvalue)
-               rfc822_parse_adrlist(&env->return_path, Z_STRVAL_PP(pvalue), 
"NO HOST");
+               convert_to_string_ex(pvalue);
+               PHP_RFC822_PARSE_ADRLIST(&env->return_path, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "date", sizeof("date"), (void 
**) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               env->date=cpystr(Z_STRVAL_PP(pvalue));
+               env->date = cpystr(Z_STRVAL_PP(pvalue));
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "from", sizeof("from"), (void 
**) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               rfc822_parse_adrlist (&env->from, Z_STRVAL_PP(pvalue), "NO 
HOST");
+               PHP_RFC822_PARSE_ADRLIST(&env->from, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "reply_to", 
sizeof("reply_to"), (void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               rfc822_parse_adrlist (&env->reply_to, Z_STRVAL_PP(pvalue), "NO 
HOST");
+               PHP_RFC822_PARSE_ADRLIST(&env->reply_to, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "in_reply_to", 
sizeof("in_reply_to"), (void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               env->in_reply_to=cpystr(Z_STRVAL_PP(pvalue));
+               env->in_reply_to = cpystr(Z_STRVAL_PP(pvalue));
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "subject", sizeof("subject"), 
(void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               env->subject=cpystr(Z_STRVAL_PP(pvalue));
+               env->subject = cpystr(Z_STRVAL_PP(pvalue));
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "to", sizeof("to"), (void **) 
&pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               rfc822_parse_adrlist (&env->to, Z_STRVAL_PP(pvalue), "NO HOST");
+               PHP_RFC822_PARSE_ADRLIST(&env->to, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "cc", sizeof("cc"), (void **) 
&pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               rfc822_parse_adrlist (&env->cc, Z_STRVAL_PP(pvalue), "NO HOST");
+               PHP_RFC822_PARSE_ADRLIST(&env->cc, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "bcc", sizeof("bcc"), (void 
**) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
-               rfc822_parse_adrlist (&env->bcc, Z_STRVAL_PP(pvalue), "NO 
HOST");
+               PHP_RFC822_PARSE_ADRLIST(&env->bcc, pvalue);
        }
        if (zend_hash_find(Z_ARRVAL_P(envelope), "message_id", 
sizeof("message_id"), (void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);

http://cvs.php.net/viewvc.cgi/php-src/ext/imap/tests/bug45705_1.phpt?view=markup&rev=1.1
Index: php-src/ext/imap/tests/bug45705_1.phpt
+++ php-src/ext/imap/tests/bug45705_1.phpt
--TEST--
Bug #45705 test #1 (imap rfc822_parse_adrlist() modifies passed address 
parameter)
--SKIPIF--
<?php
        if (!extension_loaded("imap")) { 
                die("skip imap extension not available");  
        }
?>
--FILE--
<?php

$address = 'John Doe <[EMAIL PROTECTED]>';
var_dump($address);
imap_rfc822_parse_adrlist($address, null);
var_dump($address);

?>
--EXPECT--
unicode(27) "John Doe <[EMAIL PROTECTED]>"
unicode(27) "John Doe <[EMAIL PROTECTED]>"

http://cvs.php.net/viewvc.cgi/php-src/ext/imap/tests/bug45705_2.phpt?view=markup&rev=1.1
Index: php-src/ext/imap/tests/bug45705_2.phpt
+++ php-src/ext/imap/tests/bug45705_2.phpt
--TEST--
Bug #45705 test #2 (imap rfc822_parse_adrlist() modifies passed address 
parameter)
--SKIPIF--
<?php
        if (!extension_loaded("imap")) { 
                die("skip imap extension not available");  
        }
?>
--FILE--
<?php

$envelope = array('return_path' => 'John Doe <[EMAIL PROTECTED]>',
                  'from'        => 'John Doe <[EMAIL PROTECTED]>',
                  'reply_to'    => 'John Doe <[EMAIL PROTECTED]>',
                  'to'          => 'John Doe <[EMAIL PROTECTED]>',
                  'cc'          => 'John Doe <[EMAIL PROTECTED]>',
                  'bcc'         => 'John Doe <[EMAIL PROTECTED]>',
);

var_dump($envelope);
imap_mail_compose($envelope, array(1 => array()));
var_dump($envelope);

?>
--EXPECT--
array(6) {
  [u"return_path"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"from"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"reply_to"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"to"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"cc"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"bcc"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
}
array(6) {
  [u"return_path"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"from"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"reply_to"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"to"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"cc"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
  [u"bcc"]=>
  unicode(27) "John Doe <[EMAIL PROTECTED]>"
}



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to