diff options
Diffstat (limited to 'ext/imap/php_imap.c')
-rw-r--r-- | ext/imap/php_imap.c | 304 |
1 files changed, 200 insertions, 104 deletions
diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index b93100d67..e58e99778 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2008 The PHP Group | + | Copyright (c) 1997-2009 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -26,7 +26,7 @@ | PHP 4.0 updates: Zeev Suraski <zeev@zend.com> | +----------------------------------------------------------------------+ */ -/* $Id: php_imap.c,v 1.208.2.7.2.31 2008/04/17 11:04:49 felipe Exp $ */ +/* $Id: php_imap.c,v 1.208.2.7.2.43 2008/12/31 11:17:38 sebastian Exp $ */ #define IMAP41 @@ -40,6 +40,7 @@ #include "ext/standard/php_string.h" #include "ext/standard/info.h" #include "ext/standard/file.h" +#include "ext/standard/php_smart_str.h" #ifdef ERROR #undef ERROR @@ -66,10 +67,11 @@ MAILSTREAM DEFAULTPROTO; #define SENDBUFLEN 16385 #endif + static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC); static void _php_imap_add_body(zval *arg, BODY *body TSRMLS_DC); -static void _php_imap_parse_address(ADDRESS *addresslist, char **fulladdress, zval *paddress TSRMLS_DC); -static int _php_imap_address_size(ADDRESS *addresslist); +static char* _php_imap_parse_address(ADDRESS *addresslist, zval *paddress TSRMLS_DC); +static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC); /* the gets we use */ static char *php_mail_gets(readfn_t f, void *stream, unsigned long size, GETS_DATA *md); @@ -717,23 +719,26 @@ PHP_RSHUTDOWN_FUNCTION(imap) } /* }}} */ - -/* {{{ PHP_MINFO_FUNCTION - */ -PHP_MINFO_FUNCTION(imap) -{ - php_info_print_table_start(); +#if !defined(CCLIENTVERSION) #if HAVE_IMAP2004 - php_info_print_table_row(2, "IMAP c-Client Version", "2004"); +#define CCLIENTVERSION "2004" #elif HAVE_IMAP2001 - php_info_print_table_row(2, "IMAP c-Client Version", "2001"); +#define CCLIENTVERSION "2001" #elif HAVE_IMAP2000 - php_info_print_table_row(2, "IMAP c-Client Version", "2000"); +#define CCLIENTVERSION "2000" #elif defined(IMAP41) - php_info_print_table_row(2, "IMAP c-Client Version", "4.1"); +#define CCLIENTVERSION "4.1" #else - php_info_print_table_row(2, "IMAP c-Client Version", "4.0"); +#define CCLIENTVERSION "4.0" #endif +#endif + +/* {{{ PHP_MINFO_FUNCTION + */ +PHP_MINFO_FUNCTION(imap) +{ + php_info_print_table_start(); + php_info_print_table_row(2, "IMAP c-Client Version", CCLIENTVERSION); #if HAVE_IMAP_SSL php_info_print_table_row(2, "SSL Support", "enabled"); #endif @@ -1135,6 +1140,13 @@ PHP_FUNCTION(imap_close) if (myargcount == 2) { convert_to_long_ex(options); flags = Z_LVAL_PP(options); + + /* Check that flags is exactly equal to PHP_EXPUNGE or Zero*/ + if (flags && ((flags & ~PHP_EXPUNGE) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the flags parameter"); + RETURN_FALSE; + } + /* Do the translation from PHP's internal PHP_EXPUNGE define to c-client's CL_EXPUNGE */ if (flags & PHP_EXPUNGE) { flags ^= PHP_EXPUNGE; @@ -1203,22 +1215,29 @@ PHP_FUNCTION(imap_headers) Read the message body */ PHP_FUNCTION(imap_body) { - zval **streamind, **msgno, **flags; + zval **streamind, **msgno, **pflags; pils *imap_le_struct; int msgindex, myargc=ZEND_NUM_ARGS(); + long flags=0L; - if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &flags) == FAILURE) { + if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &pflags) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); convert_to_long_ex(msgno); if (myargc == 3) { - convert_to_long_ex(flags); + convert_to_long_ex(pflags); + flags = Z_LVAL_PP(pflags); + if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the options parameter"); + RETURN_FALSE; + } } - if ((myargc == 3) && (Z_LVAL_PP(flags) & FT_UID)) { + if ((myargc == 3) && (flags & FT_UID)) { /* This should be cached; if it causes an extra RTT to the IMAP server, then that's the price we pay for making sure we don't crash. */ @@ -1231,7 +1250,7 @@ PHP_FUNCTION(imap_body) RETURN_FALSE; } - RETVAL_STRING(mail_fetchtext_full (imap_le_struct->imap_stream, Z_LVAL_PP(msgno), NIL, myargc==3 ? Z_LVAL_PP(flags) : NIL), 1); + RETVAL_STRING(mail_fetchtext_full (imap_le_struct->imap_stream, Z_LVAL_PP(msgno), NIL, myargc==3 ? Z_LVAL_PP(pflags) : NIL), 1); } /* }}} */ @@ -1451,7 +1470,7 @@ PHP_FUNCTION(imap_list_full) } /* }}} */ -/* {{{ proto array imap_scan(resource stream_id, string ref, string pattern, string content) +/* {{{ proto array imap_listscan(resource stream_id, string ref, string pattern, string content) Read list of mailboxes containing a certain string */ PHP_FUNCTION(imap_listscan) { @@ -1575,7 +1594,7 @@ PHP_FUNCTION(imap_headerinfo) pils *imap_le_struct; MESSAGECACHE *cache; ENVELOPE *en; - char dummy[2000], fulladdress[MAILTMPLEN]; + char dummy[2000], fulladdress[MAILTMPLEN + 1]; int myargc = ZEND_NUM_ARGS(); if (myargc < 2 || myargc > 5 || zend_get_parameters_ex(myargc, &streamind, &msgno, &fromlength, &subjectlength, &defaulthost) == FAILURE) { @@ -1587,8 +1606,8 @@ PHP_FUNCTION(imap_headerinfo) convert_to_long_ex(msgno); if (myargc >= 3) { convert_to_long_ex(fromlength); - if (Z_LVAL_PP(fromlength) < 0 || Z_LVAL_PP(fromlength) >= MAILTMPLEN) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "From length has to be between 1 and %i", MAILTMPLEN); + if (Z_LVAL_PP(fromlength) < 0 || Z_LVAL_PP(fromlength) > MAILTMPLEN) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "From length has to be between 0 and %d", MAILTMPLEN); RETURN_FALSE; } } else { @@ -1596,8 +1615,8 @@ PHP_FUNCTION(imap_headerinfo) } if (myargc >= 4) { convert_to_long_ex(subjectlength); - if (Z_LVAL_PP(subjectlength) < 0 || Z_LVAL_PP(subjectlength) >= MAILTMPLEN) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Subject length has to be between 1 and %i", MAILTMPLEN); + if (Z_LVAL_PP(subjectlength) < 0 || Z_LVAL_PP(subjectlength) > MAILTMPLEN) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Subject length has to be between 0 and %d", MAILTMPLEN); RETURN_FALSE; } } else { @@ -1825,14 +1844,16 @@ PHP_FUNCTION(imap_unsubscribe) Read the full structure of a message */ PHP_FUNCTION(imap_fetchstructure) { - zval **streamind, **msgno, **flags; + zval **streamind, **msgno, **pflags; pils *imap_le_struct; BODY *body; int msgindex, myargc=ZEND_NUM_ARGS(); + long flags=0L; - if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &flags) == FAILURE) { + if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &pflags) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); @@ -1841,12 +1862,18 @@ PHP_FUNCTION(imap_fetchstructure) RETURN_FALSE; } if (myargc == 3) { - convert_to_long_ex(flags); + convert_to_long_ex(pflags); + flags = Z_LVAL_PP(pflags); + + if (flags && ((flags & ~FT_UID) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the options parameter"); + RETURN_FALSE; + } } object_init(return_value); - if ((myargc == 3) && (Z_LVAL_PP(flags) & FT_UID)) { + if ((myargc == 3) && (flags & FT_UID)) { /* This should be cached; if it causes an extra RTT to the IMAP server, then that's the price we pay for making sure we don't crash. */ @@ -1856,7 +1883,7 @@ PHP_FUNCTION(imap_fetchstructure) } PHP_IMAP_CHECK_MSGNO(msgindex); - mail_fetchstructure_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), &body , myargc == 3 ? Z_LVAL_PP(flags) : NIL); + mail_fetchstructure_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), &body , myargc == 3 ? Z_LVAL_PP(pflags) : NIL); if (!body) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No body information available"); @@ -1871,30 +1898,37 @@ PHP_FUNCTION(imap_fetchstructure) Get a specific body section */ PHP_FUNCTION(imap_fetchbody) { - zval **streamind, **msgno, **sec, **flags; + zval **streamind, **msgno, **sec, **pflags; pils *imap_le_struct; char *body; + long flags=0L; unsigned long len; int myargc=ZEND_NUM_ARGS(); - if (myargc < 3 || myargc > 4 || zend_get_parameters_ex(myargc, &streamind, &msgno, &sec, &flags) == FAILURE) { + if (myargc < 3 || myargc > 4 || zend_get_parameters_ex(myargc, &streamind, &msgno, &sec, &pflags) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); convert_to_long_ex(msgno); convert_to_string_ex(sec); if (myargc == 4) { - convert_to_long_ex(flags); + convert_to_long_ex(pflags); + flags = Z_LVAL_PP(pflags); + if (flags && ((flags & ~(FT_UID|FT_PEEK|FT_INTERNAL)) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the options parameter"); + RETURN_FALSE; + } } - if (myargc < 4 || !(Z_LVAL_PP(flags) & FT_UID)) { + if (myargc < 4 || !(flags & FT_UID)) { /* only perform the check if the msgno is a message number and not a UID */ PHP_IMAP_CHECK_MSGNO(Z_LVAL_PP(msgno)); } - body = mail_fetchbody_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), Z_STRVAL_PP(sec), &len, myargc==4 ? Z_LVAL_PP(flags) : NIL); + body = mail_fetchbody_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), Z_STRVAL_PP(sec), &len, myargc==4 ? Z_LVAL_PP(pflags) : NIL); if (!body) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No body information available"); @@ -2109,7 +2143,7 @@ PHP_FUNCTION(imap_rfc822_write_address) { zval **mailbox, **host, **personal; ADDRESS *addr; - char string[MAILTMPLEN]; + char *string; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &mailbox, &host, &personal) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); @@ -2137,13 +2171,12 @@ PHP_FUNCTION(imap_rfc822_write_address) addr->error=NIL; addr->adl=NIL; - if (_php_imap_address_size(addr) >= MAILTMPLEN) { + string = _php_rfc822_write_address(addr TSRMLS_CC); + if (string) { + RETVAL_STRING(string, 0); + } else { RETURN_FALSE; } - - string[0]='\0'; - rfc822_write_address(string, addr); - RETVAL_STRING(string, 1); } /* }}} */ @@ -2154,7 +2187,8 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist) zval **str, **defaulthost, *tovals; ADDRESS *addresstmp; ENVELOPE *env; - + char *str_copy; + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &str, &defaulthost) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } @@ -2165,7 +2199,10 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist) env = mail_newenvelope(); - rfc822_parse_adrlist(&env->to, Z_STRVAL_PP(str), Z_STRVAL_PP(defaulthost)); + /* rfc822_parse_adrlist() modifies passed string. Copy it. */ + str_copy = estrndup(Z_STRVAL_PP(str), Z_STRLEN_PP(str)); + rfc822_parse_adrlist(&env->to, str_copy, Z_STRVAL_PP(defaulthost)); + efree(str_copy); array_init(return_value); @@ -2188,6 +2225,8 @@ PHP_FUNCTION(imap_rfc822_parse_adrlist) } add_next_index_object(return_value, tovals TSRMLS_CC); } while ((addresstmp = addresstmp->next)); + + mail_free_envelope(&env); } /* }}} */ @@ -2632,22 +2671,29 @@ PHP_FUNCTION(imap_sort) Get the full unfiltered header for a message */ PHP_FUNCTION(imap_fetchheader) { - zval **streamind, **msgno, **flags; + zval **streamind, **msgno, **pflags; pils *imap_le_struct; int msgindex, myargc = ZEND_NUM_ARGS(); + long flags=0L; - if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &flags) == FAILURE) { + if (myargc < 2 || myargc > 3 || zend_get_parameters_ex(myargc, &streamind, &msgno, &pflags) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } - + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); convert_to_long_ex(msgno); if (myargc == 3) { - convert_to_long_ex(flags); - } + convert_to_long_ex(pflags); + flags = Z_LVAL_PP(pflags); + if (flags && ((flags & ~(FT_UID|FT_INTERNAL|FT_PREFETCHTEXT)) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the options parameter"); + RETURN_FALSE; + } + } + - if ((myargc == 3) && (Z_LVAL_PP(flags) & FT_UID)) { + if ((myargc == 3) && (flags & FT_UID)) { /* This should be cached; if it causes an extra RTT to the IMAP server, then that's the price we pay for making sure we don't crash. */ @@ -2658,7 +2704,7 @@ PHP_FUNCTION(imap_fetchheader) PHP_IMAP_CHECK_MSGNO(msgindex); - RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), NIL, NIL, (myargc == 3 ? Z_LVAL_PP(flags) : NIL)), 1); + RETVAL_STRING(mail_fetchheader_full(imap_le_struct->imap_stream, Z_LVAL_PP(msgno), NIL, NIL, (myargc == 3 ? Z_LVAL_PP(pflags) : NIL)), 1); } /* }}} */ @@ -2873,7 +2919,7 @@ PHP_FUNCTION(imap_fetch_overview) zval **streamind, **sequence, **pflags; pils *imap_le_struct; zval *myoverview; - char address[MAILTMPLEN]; + char *address; long status, flags=0L; int myargc = ZEND_NUM_ARGS(); @@ -2881,12 +2927,17 @@ PHP_FUNCTION(imap_fetch_overview) ZEND_WRONG_PARAM_COUNT(); } + ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); convert_to_string_ex(sequence); if(myargc == 3) { convert_to_long_ex(pflags); flags = Z_LVAL_PP(pflags); + if (flags && ((flags & ~FT_UID) != 0)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid value for the options parameter"); + RETURN_FALSE; + } } array_init(return_value); @@ -2908,17 +2959,19 @@ PHP_FUNCTION(imap_fetch_overview) if (env->subject) { add_property_string(myoverview, "subject", env->subject, 1); } - if (env->from && _php_imap_address_size(env->from) < MAILTMPLEN) { + if (env->from) { env->from->next=NULL; - address[0] = '\0'; - rfc822_write_address(address, env->from); - add_property_string(myoverview, "from", address, 1); + address =_php_rfc822_write_address(env->from TSRMLS_CC); + if (address) { + add_property_string(myoverview, "from", address, 0); + } } - if (env->to && _php_imap_address_size(env->to) < MAILTMPLEN) { + if (env->to) { env->to->next = NULL; - address[0] = '\0'; - rfc822_write_address(address, env->to); - add_property_string(myoverview, "to", address, 1); + address = _php_rfc822_write_address(env->to TSRMLS_CC); + if (address) { + add_property_string(myoverview, "to", address, 0); + } } if (env->date) { add_property_string(myoverview, "date", env->date, 1); @@ -2961,7 +3014,7 @@ PHP_FUNCTION(imap_mail_compose) 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_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &envelope, &body) == FAILURE) { @@ -2978,50 +3031,55 @@ PHP_FUNCTION(imap_mail_compose) RETURN_FALSE; } +#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_PP(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_PP(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"); + PHP_RFC822_PARSE_ADRLIST(&env->return_path, pvalue); } if (zend_hash_find(Z_ARRVAL_PP(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_PP(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_PP(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_PP(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_PP(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_PP(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_PP(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_PP(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_PP(envelope), "message_id", sizeof("message_id"), (void **) &pvalue)== SUCCESS) { convert_to_string_ex(pvalue); - env->message_id=cpystr(Z_STRVAL_PP(pvalue)); + env->message_id = cpystr(Z_STRVAL_PP(pvalue)); } if (zend_hash_find(Z_ARRVAL_PP(envelope), "custom_headers", sizeof("custom_headers"), (void **) &pvalue)== SUCCESS) { @@ -3858,6 +3916,43 @@ static int _php_rfc822_len(char *str) /* }}} */ /* Support Functions */ + +#ifdef HAVE_RFC822_OUTPUT_ADDRESS_LIST +/* {{{ _php_rfc822_soutr + */ +static long _php_rfc822_soutr (void *stream, char *string) +{ + smart_str *ret = (smart_str*)stream; + int len = strlen(string); + + smart_str_appendl(ret, string, len); + return LONGT; +} + +/* }}} */ + +/* {{{ _php_rfc822_write_address + */ +static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) +{ + char address[MAILTMPLEN]; + smart_str ret = {0}; + RFC822BUFFER buf; + + buf.beg = address; + buf.cur = buf.beg; + buf.end = buf.beg + sizeof(address) - 1; + buf.s = &ret; + buf.f = _php_rfc822_soutr; + rfc822_output_address_list(&buf, addresslist, 0, NULL); + rfc822_output_flush(&buf); + smart_str_0(&ret); + return ret.c; +} +/* }}} */ + +#else + /* {{{ _php_imap_get_address_size */ static int _php_imap_address_size (ADDRESS *addresslist) @@ -3887,26 +3982,33 @@ static int _php_imap_address_size (ADDRESS *addresslist) /* }}} */ +/* {{{ _php_rfc822_write_address + */ +static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) +{ + char address[SENDBUFLEN]; + if (_php_imap_address_size(addresslist) >= SENDBUFLEN) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Address buffer overflow"); + return NULL; + } + address[0] = 0; + rfc822_write_address(address, addresslist); + return estrdup(address); +} +/* }}} */ +#endif /* {{{ _php_imap_parse_address */ -static void _php_imap_parse_address (ADDRESS *addresslist, char **fulladdress, zval *paddress TSRMLS_DC) +static char* _php_imap_parse_address (ADDRESS *addresslist, zval *paddress TSRMLS_DC) { + char *fulladdress; ADDRESS *addresstmp; zval *tmpvals; - char *tmpstr; - int len=0; addresstmp = addresslist; - if ((len = _php_imap_address_size(addresstmp))) { - tmpstr = (char *) pemalloc(len + 1, 1); - tmpstr[0] = '\0'; - rfc822_write_address(tmpstr, addresstmp); - *fulladdress = tmpstr; - } else { - *fulladdress = NULL; - } + fulladdress = _php_rfc822_write_address(addresstmp TSRMLS_CC); addresstmp = addresslist; do { @@ -3918,6 +4020,7 @@ static void _php_imap_parse_address (ADDRESS *addresslist, char **fulladdress, z if (addresstmp->host) add_property_string(tmpvals, "host", addresstmp->host, 1); add_next_index_object(paddress, tmpvals TSRMLS_CC); } while ((addresstmp = addresstmp->next)); + return fulladdress; } /* }}} */ @@ -3944,10 +4047,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->to) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->to, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->to, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "toaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "toaddress", fulladdress, 0); } add_assoc_object(myzvalue, "to", paddress TSRMLS_CC); } @@ -3955,10 +4057,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->from) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->from, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->from, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "fromaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "fromaddress", fulladdress, 0); } add_assoc_object(myzvalue, "from", paddress TSRMLS_CC); } @@ -3966,10 +4067,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->cc) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->cc, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->cc, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "ccaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "ccaddress", fulladdress, 0); } add_assoc_object(myzvalue, "cc", paddress TSRMLS_CC); } @@ -3977,10 +4077,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->bcc) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->bcc, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->bcc, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "bccaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "bccaddress", fulladdress, 0); } add_assoc_object(myzvalue, "bcc", paddress TSRMLS_CC); } @@ -3988,10 +4087,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->reply_to) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->reply_to, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->reply_to, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "reply_toaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "reply_toaddress", fulladdress, 0); } add_assoc_object(myzvalue, "reply_to", paddress TSRMLS_CC); } @@ -3999,10 +4097,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->sender) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->sender, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->sender, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "senderaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "senderaddress", fulladdress, 0); } add_assoc_object(myzvalue, "sender", paddress TSRMLS_CC); } @@ -4010,10 +4107,9 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) if (en->return_path) { MAKE_STD_ZVAL(paddress); array_init(paddress); - _php_imap_parse_address(en->return_path, &fulladdress, paddress TSRMLS_CC); + fulladdress = _php_imap_parse_address(en->return_path, paddress TSRMLS_CC); if (fulladdress) { - add_property_string(myzvalue, "return_pathaddress", fulladdress, 1); - free(fulladdress); + add_property_string(myzvalue, "return_pathaddress", fulladdress, 0); } add_assoc_object(myzvalue, "return_path", paddress TSRMLS_CC); } |