]> granicus.if.org Git - php/commitdiff
@- Fixed bug in imap_compose_mail() which caused crashes. (Jani)
authorfoobar <sniper@php.net>
Sat, 29 Jul 2000 18:45:06 +0000 (18:45 +0000)
committerfoobar <sniper@php.net>
Sat, 29 Jul 2000 18:45:06 +0000 (18:45 +0000)
# This one was only partly ported from php3. As some user pointed it out,
# it was working in 3.0.x. But this needs further hacking. Some error
# handlers, at least. Fixes bugs #3337 and #5084.

ext/imap/php_imap.c

index e1936a293859324ae6a4a94a6738bb0ef7e36292..ee9f29678d9196e3e925738773c0491ef6aad083 100644 (file)
@@ -21,6 +21,7 @@
    |          Chuck Hagenbuch     <chuck@horde.org>                       |
    |          Andrew Skalski      <askalski@chekinc.com>                  |
    |          Hartmut Holzgraefe  <hartmut@six.de>                        |
+   |          Jani Taskinen       <sniper@iki.fi>                         |
    | PHP 4.0 updates:  Zeev Suraski <zeev@zend.com>                       |
    +----------------------------------------------------------------------+
  */
@@ -3006,14 +3007,22 @@ PHP_FUNCTION(imap_mail_compose)
        PART *mypart=NULL, *toppart=NULL, *part;
        PARAMETER *param;
        char tmp[8*MAILTMPLEN], *mystring=NULL, *t, *tempstring;
-       
        int myargc = ZEND_NUM_ARGS();
+
        if (myargc != 2 || zend_get_parameters_ex(myargc, &envelope, &body) == FAILURE) {
                ZEND_WRONG_PARAM_COUNT();
        }
-       
-       convert_to_writable_array_ex(envelope);
-       convert_to_writable_array_ex(body);
+
+       if ((*envelope)->type != IS_ARRAY) {
+               php_error(E_WARNING, "IMAP: Expected Array as envelope parameter");
+               RETURN_FALSE;
+       }
+
+       if ((*body)->type != IS_ARRAY) {
+               php_error(E_WARNING, "IMAP: Expected Array as body parameter");
+               RETURN_FALSE;
+       }
+                                                                                               
        env=mail_newenvelope();
        if (zend_hash_find(Z_ARRVAL_PP(envelope), "remail", sizeof("remail"), (void **) &pvalue)== SUCCESS) {
                convert_to_string_ex(pvalue);
@@ -3051,16 +3060,67 @@ PHP_FUNCTION(imap_mail_compose)
                convert_to_string_ex(pvalue);
                env->message_id=cpystr(Z_STRVAL_PP(pvalue));
        }
+
        zend_hash_internal_pointer_reset(Z_ARRVAL_PP(body));
-       for (;;) {
-               if (zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data)==FAILURE) {
-                       break;
+       zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data);
+       zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind);
+
+       if (Z_TYPE_PP(data) == IS_ARRAY) {
+               bod=mail_newbody();
+               topbod=bod;
+
+               if (zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_long_ex(pvalue);
+                       bod->type = (short) Z_LVAL_PP(pvalue);
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "encoding", sizeof("encoding"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_long_ex(pvalue);
+                       bod->encoding = (short) Z_LVAL_PP(pvalue);
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "subtype", sizeof("subtype"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_string_ex(pvalue);
+                       bod->subtype = cpystr(Z_STRVAL_PP(pvalue));
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "id", sizeof("id"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_string_ex(pvalue);
+                       bod->id = cpystr(Z_STRVAL_PP(pvalue));
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "contents.data", sizeof("contents.data"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_string_ex(pvalue);
+                       bod->contents.text.data = (char *) fs_get(Z_STRLEN_PP(pvalue));
+                       memcpy(bod->contents.text.data, Z_STRVAL_PP(pvalue), Z_STRLEN_PP(pvalue)+1);
+                       bod->contents.text.size = Z_STRLEN_PP(pvalue);
                }
-               zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind);
+               if (zend_hash_find(Z_ARRVAL_PP(data), "lines", sizeof("lines"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_long_ex(pvalue);
+                       bod->size.lines = Z_LVAL_PP(pvalue);
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "bytes", sizeof("bytes"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_long_ex(pvalue);
+                       bod->size.bytes = Z_LVAL_PP(pvalue);
+               }
+               if (zend_hash_find(Z_ARRVAL_PP(data), "md5", sizeof("md5"), (void **) &pvalue)== SUCCESS) {
+                       convert_to_string_ex(pvalue);
+                       bod->md5 = cpystr(Z_STRVAL_PP(pvalue));
+               }
+       }
+
+       zend_hash_move_forward(Z_ARRVAL_PP(body));
+
+       while(zend_hash_get_current_data(Z_ARRVAL_PP(body), (void **) &data) == SUCCESS) { 
+               zend_hash_get_current_key(Z_ARRVAL_PP(body), &key, &ind); 
                if (Z_TYPE_PP(data) == IS_ARRAY) {
-                       bod=mail_newbody();
-                       topbod=bod;
+                       if (!toppart) {
+                               bod->nested.part=mail_newbody_part();
+                               mypart=bod->nested.part;
+                               toppart=mypart;
+                               bod=&mypart->body;
+                       } else {
+                                mypart->next=mail_newbody_part();
+                                mypart=mypart->next;
+                                bod=&mypart->body;
+                       }
+
                        if (zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &pvalue)== SUCCESS) {
                                convert_to_long_ex(pvalue);
                                bod->type = (short) Z_LVAL_PP(pvalue);
@@ -3071,7 +3131,7 @@ PHP_FUNCTION(imap_mail_compose)
                        }
                        if (zend_hash_find(Z_ARRVAL_PP(data), "subtype", sizeof("subtype"), (void **) &pvalue)== SUCCESS) {
                                convert_to_string_ex(pvalue);
-                               bod->subtype = cpystr(Z_STRVAL_PP(pvalue));
+                               bod->subtype = cpystr(Z_STRVAL_PP(pvalue));     
                        }
                        if (zend_hash_find(Z_ARRVAL_PP(data), "id", sizeof("id"), (void **) &pvalue)== SUCCESS) {
                                convert_to_string_ex(pvalue);
@@ -3095,17 +3155,8 @@ PHP_FUNCTION(imap_mail_compose)
                                convert_to_string_ex(pvalue);
                                bod->md5 = cpystr(Z_STRVAL_PP(pvalue));
                        }
-               }
-               zend_hash_move_forward(Z_ARRVAL_PP(body));
-               if (!toppart) {
-                       bod->nested.part=mail_newbody_part();
-                       mypart=bod->nested.part;
-                       toppart=mypart;
-                       bod=&mypart->body;
-               } else {
-                        mypart->next=mail_newbody_part();
-                        mypart=mypart->next;
-                        bod=&mypart->body;
+
+                       zend_hash_move_forward(Z_ARRVAL_PP(body));
                }
        }
 
@@ -3115,25 +3166,36 @@ PHP_FUNCTION(imap_mail_compose)
        strcpy(mystring, tmp);
 
        bod=topbod;
-       switch (bod->type) {
-               case TYPEMULTIPART:           /* multipart gets special handling */
-                       part = bod->nested.part;   /* first body part */
-                                                                               /* find cookie */
+
+       if (bod && bod->type == TYPEMULTIPART) {        
+
+               /* first body part */
+                       part = bod->nested.part;        
+
+               /* find cookie */
                        for (param = bod->parameter; param && !cookie; param = param->next) {
                                if (!strcmp (param->attribute, "BOUNDARY")) {
                                        cookie = param->value;
                                }
                        }
+
+               /* yucky default */
                        if (!cookie) {
-                               cookie = "-";  /* yucky default */
+                               cookie = "-";  
                        }
-                       do {                        /* for each part */
-                    /* build cookie */
+
+               /* for each part */
+                       do {
+                       /* build cookie */
                                sprintf (t=tmp, "--%s\015\012", cookie);
-                                                                               /* append mini-header */
+
+                       /* append mini-header */
                                rfc822_write_body_header(&t, &part->body);
-                               strcat (t, "\015\012");    /* write terminating blank line */
-                                                                               /* output cookie, mini-header, and contents */
+
+                       /* write terminating blank line */
+                               strcat (t, "\015\012");    
+
+                       /* output cookie, mini-header, and contents */
                                tempstring=emalloc(strlen(mystring)+strlen(tmp)+1);
                                strcpy(tempstring,mystring);
                                efree(mystring);
@@ -3157,17 +3219,23 @@ PHP_FUNCTION(imap_mail_compose)
                        efree(mystring);
                        mystring=tempstring;
                        strcat(mystring,tmp);
-                       break;
-               default:                      /* all else is text now */
+
+       } else if(bod) {
+
                        tempstring=emalloc(strlen(bod->contents.text.data)+strlen(mystring)+1);
                        strcpy(tempstring,mystring);
                        efree(mystring);
                        mystring=tempstring;
                        strcat(mystring, bod->contents.text.data);
-                       break;
+
+       } else {
+               efree(mystring);
+               RETURN_FALSE;
        }
 
-       RETURN_STRINGL(mystring,strlen(mystring), 1);  
+       RETVAL_STRINGL(mystring,strlen(mystring), 1);  
+       efree(tempstring);
+
 }
 /* }}} */