iliaa           Tue Jan 18 18:36:09 2005 EDT

  Modified files:              
    /php-src/ext/imap   php_imap.c 
  Log:
  Fixed bug #31142 (crash, memory leak and data loss by imap_mail_compose).
  
  
http://cvs.php.net/diff.php/php-src/ext/imap/php_imap.c?r1=1.197&r2=1.198&ty=u
Index: php-src/ext/imap/php_imap.c
diff -u php-src/ext/imap/php_imap.c:1.197 php-src/ext/imap/php_imap.c:1.198
--- php-src/ext/imap/php_imap.c:1.197   Tue Jan 18 11:32:53 2005
+++ php-src/ext/imap/php_imap.c Tue Jan 18 18:36:08 2005
@@ -26,7 +26,7 @@
    | PHP 4.0 updates:  Zeev Suraski <[EMAIL PROTECTED]>                       |
    +----------------------------------------------------------------------+
  */
-/* $Id: php_imap.c,v 1.197 2005/01/18 16:32:53 iliaa Exp $ */
+/* $Id: php_imap.c,v 1.198 2005/01/18 23:36:08 iliaa Exp $ */
 
 #define IMAP41
 
@@ -57,7 +57,8 @@
 MAILSTREAM DEFAULTPROTO;
 #endif
 
-#define CRLF   "\015\012"
+#define CRLF    "\015\012"
+#define CRLF_LEN sizeof("\015\012") - 1
 #define PHP_EXPUNGE 32768
 #define PHP_IMAP_ADDRESS_SIZE_BUF 10
 
@@ -3108,22 +3109,46 @@
                zend_hash_move_forward(Z_ARRVAL_PP(body));
        }
 
+       if (bod && bod->type == TYPEMULTIPART && (!bod->nested.part || 
!bod->nested.part->next)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot generate 
multipart e-mail without components.");
+               RETVAL_FALSE;
+               goto done;
+       }
+
+       if (bod && bod->type == TYPEMULTIPART && (!bod->nested.part || 
!bod->nested.part->next)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot generate 
multipart e-mail without components.");
+               RETVAL_FALSE;
+               goto done;
+       }
+
        rfc822_encode_body_7bit(env, topbod); 
        rfc822_header (tmp, env, topbod);
 
        /* add custom envelope headers */
        if (custom_headers_param) {
+               int l = strlen(tmp) - 2, l2;
+               PARAMETER *tp = custom_headers_param;
+
                /* remove last CRLF from tmp */
-               tmp[strlen(tmp) - 2] = '\0';
-               tempstring = emalloc(strlen(tmp) + 1);
-               strcpy(tempstring, tmp);
+               tmp[l] = '\0';
+               tempstring = emalloc(l);
+               memcpy(tempstring, tmp, l);
+               
                do {
-                       tempstring = erealloc(tempstring, strlen(tempstring) + 
strlen(custom_headers_param->value) + strlen(CRLF) + 1);
-                       sprintf(tempstring, "%s%s%s", tempstring, 
custom_headers_param->value, CRLF);
+                       l2 = strlen(custom_headers_param->value);
+                       tempstring = erealloc(tempstring, l + l2 + CRLF_LEN + 
1);
+                       memcpy(tempstring + l, custom_headers_param->value, l2);
+                       memcpy(tempstring + l + l2, CRLF, CRLF_LEN);
+                       l += l2 + CRLF_LEN;
                } while ((custom_headers_param = custom_headers_param->next));
 
-               mystring = emalloc(strlen(tempstring) + strlen(CRLF) + 1);
-               sprintf(mystring, "%s%s", tempstring, CRLF);
+               mail_free_body_parameter(&tp);          
+
+               mystring = emalloc(l + CRLF_LEN + 1);
+               memcpy(mystring, tempstring, l);
+               memcpy(mystring + l , CRLF, CRLF_LEN);
+               mystring[l + CRLF_LEN] = '\0';
+
                efree(tempstring);
        } else {
                mystring = emalloc(strlen(tmp) + 1);

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

Reply via email to