diff options
author | Xinchen Hui <laruence@php.net> | 2014-08-14 11:52:46 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2014-08-14 11:52:46 +0800 |
commit | bfc1ae07bec3bda6dc0522da50b35ba093d4247c (patch) | |
tree | ce6d954be2be675df92a9cab7c662bc73a6491e0 | |
parent | 35dd200430994b1b2807633e5d5dd3370b59633e (diff) | |
parent | 73fe4186370d8ca8bd0b8a4a8f995852cb42fa75 (diff) | |
download | php-git-bfc1ae07bec3bda6dc0522da50b35ba093d4247c.tar.gz |
Merge branch 'phpng' of https://git.php.net/repository/php-src into phpng
34 files changed, 506 insertions, 602 deletions
diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 78251383e1..49dab65147 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4556,7 +4556,7 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su int rs; timelib_time *t; timelib_tzinfo *tzi; - char *retstr; + zend_string *retstr; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ldddd", &time, &retformat, &latitude, &longitude, &zenith, &gmt_offset) == FAILURE) { RETURN_FALSE; @@ -4621,11 +4621,8 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_su switch (retformat) { case SUNFUNCS_RET_STRING: - spprintf(&retstr, 0, "%02d:%02d", (int) N, (int) (60 * (N - (int) N))); - // TODO: avoid reallocation ??? - RETVAL_STRINGL(retstr, 5); - efree(retstr); - return; + retstr = strpprintf(0, "%02d:%02d", (int) N, (int) (60 * (N - (int) N))); + RETURN_STR(retstr); break; case SUNFUNCS_RET_DOUBLE: RETURN_DOUBLE(N); diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index fddcad5730..09295a87f3 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -76,8 +76,8 @@ MAILSTREAM DEFAULTPROTO; 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 char* _php_imap_parse_address(ADDRESS *addresslist, zval *paddress TSRMLS_DC); -static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC); +static zend_string* _php_imap_parse_address(ADDRESS *addresslist, zval *paddress TSRMLS_DC); +static zend_string* _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); @@ -1482,7 +1482,7 @@ PHP_FUNCTION(imap_set_quota) ZEND_FETCH_RESOURCE(imap_le_struct, pils *, streamind, -1, "imap", le_imap); - limits.text.data = "STORAGE"; + limits.text.data = (unsigned char*)"STORAGE"; limits.text.size = mailbox_size; limits.next = NIL; @@ -1864,7 +1864,7 @@ PHP_FUNCTION(imap_list) array_init(return_value); cur=IMAPG(imap_folders); while (cur != NIL) { - add_next_index_string(return_value, cur->LTEXT); + add_next_index_string(return_value, (char*)cur->LTEXT); cur=cur->next; } mail_free_stringlist (&IMAPG(imap_folders)); @@ -1905,7 +1905,7 @@ PHP_FUNCTION(imap_list_full) cur=IMAPG(imap_folder_objects); while (cur != NIL) { object_init(&mboxob); - add_property_string(&mboxob, "name", cur->LTEXT); + add_property_string(&mboxob, "name", (char*)cur->LTEXT); add_property_long(&mboxob, "attributes", cur->attributes); #ifdef IMAP41 delim[0] = (char)cur->delimiter; @@ -1948,7 +1948,7 @@ PHP_FUNCTION(imap_listscan) array_init(return_value); cur=IMAPG(imap_folders); while (cur != NIL) { - add_next_index_string(return_value, cur->LTEXT); + add_next_index_string(return_value, (char*)cur->LTEXT); cur=cur->next; } mail_free_stringlist (&IMAPG(imap_folders)); @@ -2170,7 +2170,7 @@ PHP_FUNCTION(imap_lsub) array_init(return_value); cur=IMAPG(imap_sfolders); while (cur != NIL) { - add_next_index_string(return_value, cur->LTEXT); + add_next_index_string(return_value, (char*)cur->LTEXT); cur=cur->next; } mail_free_stringlist (&IMAPG(imap_sfolders)); @@ -2210,7 +2210,7 @@ PHP_FUNCTION(imap_lsub_full) cur=IMAPG(imap_sfolder_objects); while (cur != NIL) { object_init(&mboxob); - add_property_string(&mboxob, "name", cur->LTEXT); + add_property_string(&mboxob, "name", (char*)cur->LTEXT); add_property_long(&mboxob, "attributes", cur->attributes); #ifdef IMAP41 delim[0] = (char)cur->delimiter; @@ -2535,7 +2535,7 @@ PHP_FUNCTION(imap_binary) return; } - decode = rfc822_binary(text, text_len, &newlength); + decode = (char*)rfc822_binary(text, text_len, &newlength); if (decode == NULL) { RETURN_FALSE; @@ -2600,7 +2600,7 @@ PHP_FUNCTION(imap_rfc822_write_address) char *mailbox, *host, *personal; int mailbox_len, host_len, personal_len; ADDRESS *addr; - char *string; + zend_string *string; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &mailbox, &mailbox_len, &host, &host_len, &personal, &personal_len) == FAILURE) { return; @@ -2626,8 +2626,7 @@ PHP_FUNCTION(imap_rfc822_write_address) string = _php_rfc822_write_address(addr TSRMLS_CC); if (string) { - RETVAL_STRING(string); - efree(string); + RETVAL_STR(string); } else { RETURN_FALSE; } @@ -2704,7 +2703,7 @@ PHP_FUNCTION(imap_utf8) #else utf8_mime2text(&src, &dest, U8T_DECOMPOSE); #endif - RETVAL_STRINGL(dest.data, dest.size); + RETVAL_STRINGL((char*)dest.data, dest.size); if (dest.data) { free(dest.data); } @@ -2869,7 +2868,7 @@ PHP_FUNCTION(imap_utf7_decode) } #endif - RETURN_STRINGL(out, outlen); + RETURN_STRINGL((char*)out, outlen); } /* }}} */ @@ -2933,7 +2932,7 @@ PHP_FUNCTION(imap_utf7_encode) out = STR_ALLOC(outlen, 0); /* encode input string */ - outp = out->val; + outp = (unsigned char*)out->val; state = ST_NORMAL; endp = (inp = in) + inlen; while (inp < endp || state != ST_NORMAL) { @@ -3283,7 +3282,7 @@ PHP_FUNCTION(imap_bodystruct) object_init(return_value); - body=mail_body(imap_le_struct->imap_stream, msg, section); + body=mail_body(imap_le_struct->imap_stream, msg, (unsigned char*)section); if (body == NULL) { zval_dtor(return_value); RETURN_FALSE; @@ -3378,7 +3377,7 @@ PHP_FUNCTION(imap_fetch_overview) int sequence_len; pils *imap_le_struct; zval myoverview; - char *address; + zend_string *address; long status, flags = 0L; int argc = ZEND_NUM_ARGS(); @@ -3396,8 +3395,8 @@ PHP_FUNCTION(imap_fetch_overview) array_init(return_value); status = (flags & FT_UID) - ? mail_uid_sequence(imap_le_struct->imap_stream, sequence) - : mail_sequence(imap_le_struct->imap_stream, sequence); + ? mail_uid_sequence(imap_le_struct->imap_stream, (unsigned char*)sequence) + : mail_sequence(imap_le_struct->imap_stream, (unsigned char*)sequence); if (status) { MESSAGECACHE *elt; @@ -3415,22 +3414,18 @@ PHP_FUNCTION(imap_fetch_overview) env->from->next=NULL; address =_php_rfc822_write_address(env->from TSRMLS_CC); if (address) { - // TODO: avoid reallocation ??? - add_property_string(&myoverview, "from", address); - efree(address); + add_property_str(&myoverview, "from", address); } } if (env->to) { env->to->next = NULL; address = _php_rfc822_write_address(env->to TSRMLS_CC); if (address) { - // TODO: avoid reallocation ??? - add_property_string(&myoverview, "to", address); - efree(address); + add_property_str(&myoverview, "to", address); } } if (env->date) { - add_property_string(&myoverview, "date", env->date); + add_property_string(&myoverview, "date", (char*)env->date); } if (env->message_id) { add_property_string(&myoverview, "message_id", env->message_id); @@ -3494,7 +3489,7 @@ PHP_FUNCTION(imap_mail_compose) } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "date", sizeof("date") - 1)) != NULL) { convert_to_string_ex(pvalue); - env->date = cpystr(Z_STRVAL_P(pvalue)); + env->date = (unsigned char*)cpystr(Z_STRVAL_P(pvalue)); } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(envelope), "from", sizeof("from") - 1)) != NULL) { convert_to_string_ex(pvalue); @@ -3622,11 +3617,11 @@ PHP_FUNCTION(imap_mail_compose) } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "contents.data", sizeof("contents.data") - 1)) != NULL) { convert_to_string_ex(pvalue); - bod->contents.text.data = (char *) fs_get(Z_STRLEN_P(pvalue) + 1); + bod->contents.text.data = fs_get(Z_STRLEN_P(pvalue) + 1); memcpy(bod->contents.text.data, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1); bod->contents.text.size = Z_STRLEN_P(pvalue); } else { - bod->contents.text.data = (char *) fs_get(1); + bod->contents.text.data = fs_get(1); memcpy(bod->contents.text.data, "", 1); bod->contents.text.size = 0; } @@ -3726,11 +3721,11 @@ PHP_FUNCTION(imap_mail_compose) } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "contents.data", sizeof("contents.data") - 1)) != NULL) { convert_to_string_ex(pvalue); - bod->contents.text.data = (char *) fs_get(Z_STRLEN_P(pvalue) + 1); + bod->contents.text.data = fs_get(Z_STRLEN_P(pvalue) + 1); memcpy(bod->contents.text.data, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue) + 1); bod->contents.text.size = Z_STRLEN_P(pvalue); } else { - bod->contents.text.data = (char *) fs_get(1); + bod->contents.text.data = fs_get(1); memcpy(bod->contents.text.data, "", 1); bod->contents.text.size = 0; } @@ -4133,7 +4128,7 @@ PHP_FUNCTION(imap_alerts) cur = IMAPG(imap_alertstack); while (cur != NIL) { - add_next_index_string(return_value, cur->LTEXT); + add_next_index_string(return_value, (char*)cur->LTEXT); cur = cur->next; } mail_free_stringlist(&IMAPG(imap_alertstack)); @@ -4160,7 +4155,7 @@ PHP_FUNCTION(imap_errors) cur = IMAPG(imap_errorstack); while (cur != NIL) { - add_next_index_string(return_value, cur->LTEXT); + add_next_index_string(return_value, (char*)cur->LTEXT); cur = cur->next; } mail_free_errorlist(&IMAPG(imap_errorstack)); @@ -4186,7 +4181,7 @@ PHP_FUNCTION(imap_last_error) cur = IMAPG(imap_errorstack); while (cur != NIL) { if (cur->next == NIL) { - RETURN_STRING(cur->LTEXT); + RETURN_STRING((char*)cur->LTEXT); } cur = cur->next; } @@ -4305,10 +4300,9 @@ static long _php_rfc822_soutr (void *stream, char *string) /* {{{ _php_rfc822_write_address */ -static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) +static zend_string* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) { char address[MAILTMPLEN]; - char *str; smart_str ret = {0}; RFC822BUFFER buf; @@ -4320,11 +4314,7 @@ static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) rfc822_output_address_list(&buf, addresslist, 0, NULL); rfc822_output_flush(&buf); smart_str_0(&ret); - /* avoide dup? */ - str = estrndup(ret.s->val, ret.s->len); - smart_str_free(&ret); - - return str; + return ret.s; } /* }}} */ @@ -4390,7 +4380,7 @@ static int _php_imap_address_size (ADDRESS *addresslist) /* {{{ _php_rfc822_write_address */ -static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) +static zend_string* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) { char address[SENDBUFLEN]; @@ -4400,15 +4390,15 @@ static char* _php_rfc822_write_address(ADDRESS *addresslist TSRMLS_DC) } address[0] = 0; rfc822_write_address(address, addresslist); - return estrdup(address); + return STR_INIT(address, strlen(address), 0); } /* }}} */ #endif /* {{{ _php_imap_parse_address */ -static char* _php_imap_parse_address (ADDRESS *addresslist, zval *paddress TSRMLS_DC) +static zend_string* _php_imap_parse_address (ADDRESS *addresslist, zval *paddress TSRMLS_DC) { - char *fulladdress; + zend_string *fulladdress; ADDRESS *addresstmp; zval tmpvals; @@ -4434,13 +4424,13 @@ static char* _php_imap_parse_address (ADDRESS *addresslist, zval *paddress TSRML static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) { zval paddress; - char *fulladdress=NULL; + zend_string *fulladdress=NULL; object_init(myzvalue); if (en->remail) add_property_string(myzvalue, "remail", en->remail); - if (en->date) add_property_string(myzvalue, "date", en->date); - if (en->date) add_property_string(myzvalue, "Date", en->date); + if (en->date) add_property_string(myzvalue, "date", (char*)en->date); + if (en->date) add_property_string(myzvalue, "Date", (char*)en->date); if (en->subject) add_property_string(myzvalue, "subject", en->subject); if (en->subject) add_property_string(myzvalue, "Subject", en->subject); if (en->in_reply_to) add_property_string(myzvalue, "in_reply_to", en->in_reply_to); @@ -4453,9 +4443,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->to, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "toaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "toaddress", fulladdress); } add_assoc_object(myzvalue, "to", &paddress TSRMLS_CC); } @@ -4464,9 +4452,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->from, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "fromaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "fromaddress", fulladdress); } add_assoc_object(myzvalue, "from", &paddress TSRMLS_CC); } @@ -4475,9 +4461,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->cc, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "ccaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "ccaddress", fulladdress); } add_assoc_object(myzvalue, "cc", &paddress TSRMLS_CC); } @@ -4486,9 +4470,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->bcc, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "bccaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "bccaddress", fulladdress); } add_assoc_object(myzvalue, "bcc", &paddress TSRMLS_CC); } @@ -4497,9 +4479,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->reply_to, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "reply_toaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "reply_toaddress", fulladdress); } add_assoc_object(myzvalue, "reply_to", &paddress TSRMLS_CC); } @@ -4508,9 +4488,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->sender, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "senderaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "senderaddress", fulladdress); } add_assoc_object(myzvalue, "sender", &paddress TSRMLS_CC); } @@ -4519,9 +4497,7 @@ static void _php_make_header_object(zval *myzvalue, ENVELOPE *en TSRMLS_DC) array_init(&paddress); fulladdress = _php_imap_parse_address(en->return_path, &paddress TSRMLS_CC); if (fulladdress) { - // TODO: avoid reallocation ??? - add_property_string(myzvalue, "return_pathaddress", fulladdress); - efree(fulladdress); + add_property_str(myzvalue, "return_pathaddress", fulladdress); } add_assoc_object(myzvalue, "return_path", &paddress TSRMLS_CC); } @@ -4873,7 +4849,7 @@ PHP_IMAP_EXPORT void mm_notify(MAILSTREAM *stream, char *str, long errflg) if (strncmp(str, "[ALERT] ", 8) == 0) { if (IMAPG(imap_alertstack) == NIL) { IMAPG(imap_alertstack) = mail_newstringlist(); - IMAPG(imap_alertstack)->LSIZE = strlen(IMAPG(imap_alertstack)->LTEXT = cpystr(str)); + IMAPG(imap_alertstack)->LSIZE = strlen((char*)(IMAPG(imap_alertstack)->LTEXT = (unsigned char*)cpystr(str))); IMAPG(imap_alertstack)->next = NIL; } else { cur = IMAPG(imap_alertstack); @@ -4882,7 +4858,7 @@ PHP_IMAP_EXPORT void mm_notify(MAILSTREAM *stream, char *str, long errflg) } cur->next = mail_newstringlist (); cur = cur->next; - cur->LSIZE = strlen(cur->LTEXT = cpystr(str)); + cur->LSIZE = strlen((char*)(cur->LTEXT = (unsigned char*)cpystr(str))); cur->next = NIL; } } @@ -4899,7 +4875,7 @@ PHP_IMAP_EXPORT void mm_list(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, /* Author: CJH */ if (IMAPG(imap_folder_objects) == NIL) { IMAPG(imap_folder_objects) = mail_newfolderobjectlist(); - IMAPG(imap_folder_objects)->LSIZE=strlen(IMAPG(imap_folder_objects)->LTEXT=cpystr(mailbox)); + IMAPG(imap_folder_objects)->LSIZE=strlen((char*)(IMAPG(imap_folder_objects)->LTEXT = (unsigned char*)cpystr(mailbox))); IMAPG(imap_folder_objects)->delimiter = delimiter; IMAPG(imap_folder_objects)->attributes = attributes; IMAPG(imap_folder_objects)->next = NIL; @@ -4908,7 +4884,7 @@ PHP_IMAP_EXPORT void mm_list(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, ocur=IMAPG(imap_folder_objects_tail); ocur->next=mail_newfolderobjectlist(); ocur=ocur->next; - ocur->LSIZE = strlen(ocur->LTEXT = cpystr(mailbox)); + ocur->LSIZE = strlen((char*)(ocur->LTEXT = (unsigned char*)cpystr(mailbox))); ocur->delimiter = delimiter; ocur->attributes = attributes; ocur->next = NIL; @@ -4920,14 +4896,14 @@ PHP_IMAP_EXPORT void mm_list(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, if (!(attributes & LATT_NOSELECT)) { if (IMAPG(imap_folders) == NIL) { IMAPG(imap_folders)=mail_newstringlist(); - IMAPG(imap_folders)->LSIZE=strlen(IMAPG(imap_folders)->LTEXT=cpystr(mailbox)); + IMAPG(imap_folders)->LSIZE=strlen((char*)(IMAPG(imap_folders)->LTEXT = (unsigned char*)cpystr(mailbox))); IMAPG(imap_folders)->next=NIL; IMAPG(imap_folders_tail) = IMAPG(imap_folders); } else { cur=IMAPG(imap_folders_tail); cur->next=mail_newstringlist (); cur=cur->next; - cur->LSIZE = strlen (cur->LTEXT = cpystr (mailbox)); + cur->LSIZE = strlen((char*)(cur->LTEXT = (unsigned char*)cpystr(mailbox))); cur->next = NIL; IMAPG(imap_folders_tail) = cur; } @@ -4946,7 +4922,7 @@ PHP_IMAP_EXPORT void mm_lsub(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, /* Author: CJH */ if (IMAPG(imap_sfolder_objects) == NIL) { IMAPG(imap_sfolder_objects) = mail_newfolderobjectlist(); - IMAPG(imap_sfolder_objects)->LSIZE=strlen(IMAPG(imap_sfolder_objects)->LTEXT=cpystr(mailbox)); + IMAPG(imap_sfolder_objects)->LSIZE = strlen((char*)(IMAPG(imap_sfolder_objects)->LTEXT = (unsigned char*)cpystr(mailbox))); IMAPG(imap_sfolder_objects)->delimiter = delimiter; IMAPG(imap_sfolder_objects)->attributes = attributes; IMAPG(imap_sfolder_objects)->next = NIL; @@ -4955,7 +4931,7 @@ PHP_IMAP_EXPORT void mm_lsub(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, ocur=IMAPG(imap_sfolder_objects_tail); ocur->next=mail_newfolderobjectlist(); ocur=ocur->next; - ocur->LSIZE=strlen(ocur->LTEXT = cpystr(mailbox)); + ocur->LSIZE=strlen((char*)(ocur->LTEXT = (unsigned char*)cpystr(mailbox))); ocur->delimiter = delimiter; ocur->attributes = attributes; ocur->next = NIL; @@ -4965,14 +4941,14 @@ PHP_IMAP_EXPORT void mm_lsub(MAILSTREAM *stream, DTYPE delimiter, char *mailbox, /* build the old simple array for imap_listsubscribed() */ if (IMAPG(imap_sfolders) == NIL) { IMAPG(imap_sfolders)=mail_newstringlist(); - IMAPG(imap_sfolders)->LSIZE=strlen(IMAPG(imap_sfolders)->LTEXT=cpystr(mailbox)); + IMAPG(imap_sfolders)->LSIZE=strlen((char*)(IMAPG(imap_sfolders)->LTEXT = (unsigned char*)cpystr(mailbox))); IMAPG(imap_sfolders)->next=NIL; IMAPG(imap_sfolders_tail) = IMAPG(imap_sfolders); } else { cur=IMAPG(imap_sfolders_tail); cur->next=mail_newstringlist (); cur=cur->next; - cur->LSIZE = strlen (cur->LTEXT = cpystr (mailbox)); + cur->LSIZE = strlen((char*)(cur->LTEXT = (unsigned char*)cpystr(mailbox))); cur->next = NIL; IMAPG(imap_sfolders_tail) = cur; } @@ -5010,7 +4986,7 @@ PHP_IMAP_EXPORT void mm_log(char *str, long errflg) if (errflg != NIL) { /* CJH: maybe put these into a more comprehensive log for debugging purposes? */ if (IMAPG(imap_errorstack) == NIL) { IMAPG(imap_errorstack) = mail_newerrorlist(); - IMAPG(imap_errorstack)->LSIZE = strlen(IMAPG(imap_errorstack)->LTEXT = cpystr(str)); + IMAPG(imap_errorstack)->LSIZE = strlen((char*)(IMAPG(imap_errorstack)->LTEXT = (unsigned char*)cpystr(str))); IMAPG(imap_errorstack)->errflg = errflg; IMAPG(imap_errorstack)->next = NIL; } else { @@ -5020,7 +4996,7 @@ PHP_IMAP_EXPORT void mm_log(char *str, long errflg) } cur->next = mail_newerrorlist(); cur = cur->next; - cur->LSIZE = strlen(cur->LTEXT = cpystr(str)); + cur->LSIZE = strlen((char*)(cur->LTEXT = (unsigned char*)cpystr(str))); cur->errflg = errflg; cur->next = NIL; } diff --git a/ext/mysqlnd/mysqlnd_net.c b/ext/mysqlnd/mysqlnd_net.c index 76e49a5d9d..84757f88c1 100644 --- a/ext/mysqlnd/mysqlnd_net.c +++ b/ext/mysqlnd/mysqlnd_net.c @@ -160,7 +160,7 @@ MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const cha unsigned int streams_flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT; char * hashed_details = NULL; int hashed_details_len = 0; - char * errstr = NULL; + zend_string *errstr = NULL; int errcode = 0; struct timeval tv; dtor_func_t origin_dtor; @@ -190,10 +190,10 @@ MYSQLND_METHOD(mysqlnd_net, open_tcp_or_unix)(MYSQLND_NET * const net, const cha mnd_sprintf_free(hashed_details); } errcode = CR_CONNECTION_ERROR; - SET_CLIENT_ERROR(*error_info, errcode? errcode:CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, errstr); + SET_CLIENT_ERROR(*error_info, errcode? errcode:CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, errstr->val); if (errstr) { /* no mnd_ since we don't allocate it */ - efree(errstr); + STR_RELEASE(errstr); } DBG_RETURN(NULL); } diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 5fb5990050..10384da2ad 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -2954,7 +2954,7 @@ static void php_odbc_lasterror(INTERNAL_FUNCTION_PARAMETERS, int mode) { odbc_connection *conn; zval *pv_handle; - char *ptr; + zend_string *ptr; int len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &pv_handle) == FAILURE) { @@ -2969,23 +2969,21 @@ static void php_odbc_lasterror(INTERNAL_FUNCTION_PARAMETERS, int mode) if (ZEND_NUM_ARGS() == 1) { ZEND_FETCH_RESOURCE2(conn, odbc_connection *, pv_handle, -1, "ODBC-Link", le_conn, le_pconn); - ptr = ecalloc(len + 1, 1); + ptr = STR_ALLOC(len + 1, 0); if (mode == 0) { - strlcpy(ptr, conn->laststate, len+1); + strlcpy(ptr->val, conn->laststate, len+1); } else { - strlcpy(ptr, conn->lasterrormsg, len+1); + strlcpy(ptr->val, conn->lasterrormsg, len+1); } } else { - ptr = ecalloc(len + 1, 1); + ptr = STR_ALLOC(len, 0); if (mode == 0) { - strlcpy(ptr, ODBCG(laststate), len+1); + strlcpy(ptr->val, ODBCG(laststate), len+1); } else { - strlcpy(ptr, ODBCG(lasterrormsg), len+1); + strlcpy(ptr->val, ODBCG(lasterrormsg), len+1); } } - RETVAL_STRING(ptr); - // TODO: avoid double reallocation ??? - efree(ptr); + RETVAL_STR(ptr); } /* }}} */ diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index cf89f8d17f..1d75ff08fc 100755 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1760,31 +1760,30 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len TSRMLS_DC) +zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw TSRMLS_DC) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; unsigned int n; + zend_string *ret; if (!(mdtype = EVP_get_digestbyname(method))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - return FAILURE; + return NULL; } else if (!X509_digest(peer, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); - return FAILURE; + return NULL; } if (raw) { - *out_len = n; - *out = estrndup((char *) md, n); + ret = STR_INIT((char*)md, n, 0); } else { - *out_len = n * 2; - *out = emalloc(*out_len + 1); - - make_digest_ex(*out, md, n); + ret = STR_ALLOC(n * 2, 0); + make_digest_ex(ret->val, md, n); + ret->val[n * 2] = '\0'; } - return SUCCESS; + return ret; } PHP_FUNCTION(openssl_x509_fingerprint) @@ -1795,9 +1794,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) zend_bool raw_output = 0; char *method = "sha1"; int method_len; - - char *fingerprint; - int fingerprint_len; + zend_string *fingerprint; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; @@ -1809,10 +1806,9 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { - // TODO: avoid reallocation ??? - RETVAL_STRINGL(fingerprint, fingerprint_len); - efree(fingerprint); + fingerprint = php_openssl_x509_fingerprint(cert, method, raw_output TSRMLS_CC); + if (fingerprint) { + RETVAL_STR(fingerprint); } else { RETVAL_FALSE; } @@ -3458,12 +3454,10 @@ static int php_openssl_is_private_key(EVP_PKEY* pkey TSRMLS_DC) #define OPENSSL_PKEY_GET_BN(_type, _name) do { \ if (pkey->pkey._type->_name != NULL) { \ int len = BN_num_bytes(pkey->pkey._type->_name); \ - char *str = emalloc(len + 1); \ - BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str); \ - str[len] = 0; \ - /* TODO: avoid reallocation ??? */ \ - add_assoc_stringl(&_type, #_name, str, len); \ - efree(str); \ + zend_string *str = STR_ALLOC(len, 0); \ + BN_bn2bin(pkey->pkey._type->_name, (unsigned char*)str->val); \ + str->val[len] = 0; \ + add_assoc_str(&_type, #_name, str); \ } \ } while (0) @@ -3877,7 +3871,7 @@ PHP_FUNCTION(openssl_pbkdf2) char *password; int password_len; char *salt; int salt_len; char *method; int method_len = 0; - unsigned char *out_buffer; + zend_string *out_buffer; const EVP_MD *digest; @@ -3904,15 +3898,13 @@ PHP_FUNCTION(openssl_pbkdf2) RETURN_FALSE; } - out_buffer = emalloc(key_length + 1); - out_buffer[key_length] = '\0'; + out_buffer = STR_ALLOC(key_length, 0); - if (PKCS5_PBKDF2_HMAC(password, password_len, (unsigned char *)salt, salt_len, iterations, digest, key_length, out_buffer) == 1) { - // TODO: avoid reallocation ??? - RETVAL_STRINGL((char *)out_buffer, key_length); - efree(out_buffer); + if (PKCS5_PBKDF2_HMAC(password, password_len, (unsigned char *)salt, salt_len, iterations, digest, key_length, (unsigned char*)out_buffer->val) == 1) { + out_buffer->val[key_length] = 0; + RETURN_STR(out_buffer); } else { - efree(out_buffer); + STR_RELEASE(out_buffer); RETURN_FALSE; } } @@ -4336,7 +4328,7 @@ PHP_FUNCTION(openssl_private_encrypt) zval *key, *crypted; EVP_PKEY *pkey; int cryptedlen; - unsigned char *cryptedbuf = NULL; + zend_string *cryptedbuf = NULL; int successful = 0; zend_resource *keyresource = NULL; char * data; @@ -4356,14 +4348,14 @@ PHP_FUNCTION(openssl_private_encrypt) } cryptedlen = EVP_PKEY_size(pkey); - cryptedbuf = emalloc(cryptedlen + 1); + cryptedbuf = STR_ALLOC(cryptedlen, 0); switch (pkey->type) { case EVP_PKEY_RSA: case EVP_PKEY_RSA2: successful = (RSA_private_encrypt(data_len, (unsigned char *)data, - cryptedbuf, + (unsigned char *)cryptedbuf->val, pkey->pkey.rsa, padding) == cryptedlen); break; @@ -4373,15 +4365,13 @@ PHP_FUNCTION(openssl_private_encrypt) if (successful) { zval_dtor(crypted); - cryptedbuf[cryptedlen] = '\0'; - // TODO: avoid reallocation ??? - ZVAL_STRINGL(crypted, (char *)cryptedbuf, cryptedlen); - efree(cryptedbuf); + cryptedbuf->val[cryptedlen] = '\0'; + ZVAL_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } if (cryptedbuf) { - efree(cryptedbuf); + STR_RELEASE(cryptedbuf); } if (keyresource == NULL) { EVP_PKEY_free(pkey); @@ -4396,7 +4386,7 @@ PHP_FUNCTION(openssl_private_decrypt) zval *key, *crypted; EVP_PKEY *pkey; int cryptedlen; - unsigned char *cryptedbuf = NULL; + zend_string *cryptedbuf = NULL; unsigned char *crypttemp; int successful = 0; long padding = RSA_PKCS1_PADDING; @@ -4427,8 +4417,8 @@ PHP_FUNCTION(openssl_private_decrypt) pkey->pkey.rsa, padding); if (cryptedlen != -1) { - cryptedbuf = emalloc(cryptedlen + 1); - memcpy(cryptedbuf, crypttemp, cryptedlen); + cryptedbuf = STR_ALLOC(cryptedlen, 0); + memcpy(cryptedbuf->val, crypttemp, cryptedlen); successful = 1; } break; @@ -4440,10 +4430,8 @@ PHP_FUNCTION(openssl_private_decrypt) if (successful) { zval_dtor(crypted); - cryptedbuf[cryptedlen] = '\0'; - // TODO: avoid reallocation ??? - ZVAL_STRINGL(crypted, (char *)cryptedbuf, cryptedlen); - efree(cryptedbuf); + cryptedbuf->val[cryptedlen] = '\0'; + ZVAL_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } @@ -4452,7 +4440,7 @@ PHP_FUNCTION(openssl_private_decrypt) EVP_PKEY_free(pkey); } if (cryptedbuf) { - efree(cryptedbuf); + STR_RELEASE(cryptedbuf); } } /* }}} */ @@ -4464,7 +4452,7 @@ PHP_FUNCTION(openssl_public_encrypt) zval *key, *crypted; EVP_PKEY *pkey; int cryptedlen; - unsigned char *cryptedbuf; + zend_string *cryptedbuf; int successful = 0; zend_resource *keyresource = NULL; long padding = RSA_PKCS1_PADDING; @@ -4482,14 +4470,14 @@ PHP_FUNCTION(openssl_public_encrypt) } cryptedlen = EVP_PKEY_size(pkey); - cryptedbuf = emalloc(cryptedlen + 1); + cryptedbuf = STR_ALLOC(cryptedlen, 0); switch (pkey->type) { case EVP_PKEY_RSA: case EVP_PKEY_RSA2: successful = (RSA_public_encrypt(data_len, (unsigned char *)data, - cryptedbuf, + (unsigned char *)cryptedbuf->val, pkey->pkey.rsa, padding) == cryptedlen); break; @@ -4500,10 +4488,8 @@ PHP_FUNCTION(openssl_public_encrypt) if (successful) { zval_dtor(crypted); - cryptedbuf[cryptedlen] = '\0'; - // TODO: avoid reallocation ??? - ZVAL_STRINGL(crypted, (char *)cryptedbuf, cryptedlen); - efree(cryptedbuf); + cryptedbuf->val[cryptedlen] = '\0'; + ZVAL_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } @@ -4511,7 +4497,7 @@ PHP_FUNCTION(openssl_public_encrypt) EVP_PKEY_free(pkey); } if (cryptedbuf) { - efree(cryptedbuf); + STR_RELEASE(cryptedbuf); } } /* }}} */ @@ -4523,7 +4509,7 @@ PHP_FUNCTION(openssl_public_decrypt) zval *key, *crypted; EVP_PKEY *pkey; int cryptedlen; - unsigned char *cryptedbuf = NULL; + zend_string *cryptedbuf = NULL; unsigned char *crypttemp; int successful = 0; zend_resource *keyresource = NULL; @@ -4554,8 +4540,8 @@ PHP_FUNCTION(openssl_public_decrypt) pkey->pkey.rsa, padding); if (cryptedlen != -1) { - cryptedbuf = emalloc(cryptedlen + 1); - memcpy(cryptedbuf, crypttemp, cryptedlen); + cryptedbuf = STR_ALLOC(cryptedlen, 0); + memcpy(cryptedbuf->val, crypttemp, cryptedlen); successful = 1; } break; @@ -4569,16 +4555,14 @@ PHP_FUNCTION(openssl_public_decrypt) if (successful) { zval_dtor(crypted); - cryptedbuf[cryptedlen] = '\0'; - // TODO: avoid reallocation ??? - ZVAL_STRINGL(crypted, (char *)cryptedbuf, cryptedlen); - efree(cryptedbuf); + cryptedbuf->val[cryptedlen] = '\0'; + ZVAL_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } if (cryptedbuf) { - efree(cryptedbuf); + STR_RELEASE(cryptedbuf); } if (keyresource == NULL) { EVP_PKEY_free(pkey); @@ -4612,8 +4596,8 @@ PHP_FUNCTION(openssl_sign) { zval *key, *signature; EVP_PKEY *pkey; - int siglen; - unsigned char *sigbuf; + unsigned int siglen; + zend_string *sigbuf; zend_resource *keyresource = NULL; char * data; int data_len; @@ -4648,16 +4632,15 @@ PHP_FUNCTION(openssl_sign) } siglen = EVP_PKEY_size(pkey); - sigbuf = emalloc(siglen + 1); + sigbuf = STR_ALLOC(siglen, 0); EVP_SignInit(&md_ctx, mdtype); EVP_SignUpdate(&md_ctx, data, data_len); - if (EVP_SignFinal (&md_ctx, sigbuf,(unsigned int *)&siglen, pkey)) { + if (EVP_SignFinal (&md_ctx, (unsigned char*)sigbuf->val, &siglen, pkey)) { zval_dtor(signature); - sigbuf[siglen] = '\0'; - // TODO: avoid reallocation ??? - ZVAL_STRINGL(signature, (char *)sigbuf, siglen); - efree(sigbuf); + sigbuf->val[siglen] = '\0'; + sigbuf->len = siglen; + ZVAL_STR(signature, sigbuf); RETVAL_TRUE; } else { efree(sigbuf); @@ -4965,8 +4948,8 @@ PHP_FUNCTION(openssl_digest) int data_len, method_len; const EVP_MD *mdtype; EVP_MD_CTX md_ctx; - int siglen; - unsigned char *sigbuf; + unsigned int siglen; + zend_string *sigbuf; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &data, &data_len, &method, &method_len, &raw_output) == FAILURE) { return; @@ -4978,28 +4961,26 @@ PHP_FUNCTION(openssl_digest) } siglen = EVP_MD_size(mdtype); - sigbuf = emalloc(siglen + 1); + sigbuf = STR_ALLOC(siglen, 0); EVP_DigestInit(&md_ctx, mdtype); EVP_DigestUpdate(&md_ctx, (unsigned char *)data, data_len); - if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf, (unsigned int *)&siglen)) { + if (EVP_DigestFinal (&md_ctx, (unsigned char *)sigbuf->val, &siglen)) { if (raw_output) { - sigbuf[siglen] = '\0'; - // TODO: avoid reallocation ??? - RETVAL_STRINGL((char *)sigbuf, siglen); - efree(sigbuf); + sigbuf->val[siglen] = '\0'; + sigbuf->len = siglen; + RETVAL_STR(sigbuf); } else { int digest_str_len = siglen * 2; - char *digest_str = emalloc(digest_str_len + 1); + zend_string *digest_str = STR_ALLOC(digest_str_len, 0); - make_digest_ex(digest_str, sigbuf, siglen); - efree(sigbuf); - // TODO: avid reallocation ??? - RETVAL_STRINGL(digest_str, digest_str_len); - efree(digest_str); + make_digest_ex(digest_str->val, (unsigned char*)sigbuf->val, siglen); + digest_str->val[digest_str_len] = '\0'; + STR_RELEASE(sigbuf); + RETVAL_STR(digest_str); } } else { - efree(sigbuf); + STR_RELEASE(sigbuf); RETVAL_FALSE; } } @@ -5049,7 +5030,8 @@ PHP_FUNCTION(openssl_encrypt) const EVP_CIPHER *cipher_type; EVP_CIPHER_CTX cipher_ctx; int i=0, outlen, keylen; - unsigned char *outbuf, *key; + zend_string *outbuf; + unsigned char *key; zend_bool free_iv; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss|ls", &data, &data_len, &method, &method_len, &password, &password_len, &options, &iv, &iv_len) == FAILURE) { @@ -5077,7 +5059,7 @@ PHP_FUNCTION(openssl_encrypt) free_iv = php_openssl_validate_iv(&iv, &iv_len, max_iv_len TSRMLS_CC); outlen = data_len + EVP_CIPHER_block_size(cipher_type); - outbuf = emalloc(outlen + 1); + outbuf = STR_ALLOC(outlen, 0); EVP_EncryptInit(&cipher_ctx, cipher_type, NULL, NULL); if (password_len > keylen) { @@ -5088,25 +5070,24 @@ PHP_FUNCTION(openssl_encrypt) EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0); } if (data_len > 0) { - EVP_EncryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len); + EVP_EncryptUpdate(&cipher_ctx, (unsigned char*)outbuf->val, &i, (unsigned char *)data, data_len); } outlen = i; - if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) { + if (EVP_EncryptFinal(&cipher_ctx, (unsigned char *)outbuf->val + i, &i)) { outlen += i; if (options & OPENSSL_RAW_DATA) { - outbuf[outlen] = '\0'; - // TODO: avoid reallocation ??? - RETVAL_STRINGL((char *)outbuf, outlen); - efree(outbuf); + outbuf->val[outlen] = '\0'; + outbuf->len = outlen; + RETVAL_STR(outbuf); } else { zend_string *base64_str; - base64_str = php_base64_encode(outbuf, outlen); - efree(outbuf); + base64_str = php_base64_encode((unsigned char*)outbuf->val, outlen); + STR_RELEASE(outbuf); RETVAL_STR(base64_str); } } else { - efree(outbuf); + STR_RELEASE(outbuf); RETVAL_FALSE; } if (key != (unsigned char*)password) { @@ -5129,7 +5110,8 @@ PHP_FUNCTION(openssl_decrypt) const EVP_CIPHER *cipher_type; EVP_CIPHER_CTX cipher_ctx; int i, outlen, keylen; - unsigned char *outbuf, *key; + zend_string *outbuf; + unsigned char *key; zend_string *base64_str = NULL; zend_bool free_iv; @@ -5170,7 +5152,7 @@ PHP_FUNCTION(openssl_decrypt) free_iv = php_openssl_validate_iv(&iv, &iv_len, EVP_CIPHER_iv_length(cipher_type) TSRMLS_CC); outlen = data_len + EVP_CIPHER_block_size(cipher_type); - outbuf = emalloc(outlen + 1); + outbuf = STR_ALLOC(outlen, 0); EVP_DecryptInit(&cipher_ctx, cipher_type, NULL, NULL); if (password_len > keylen) { @@ -5180,16 +5162,15 @@ PHP_FUNCTION(openssl_decrypt) if (options & OPENSSL_ZERO_PADDING) { EVP_CIPHER_CTX_set_padding(&cipher_ctx, 0); } - EVP_DecryptUpdate(&cipher_ctx, outbuf, &i, (unsigned char *)data, data_len); + EVP_DecryptUpdate(&cipher_ctx, (unsigned char*)outbuf->val, &i, (unsigned char *)data, data_len); outlen = i; - if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf + i, &i)) { + if (EVP_DecryptFinal(&cipher_ctx, (unsigned char *)outbuf->val + i, &i)) { outlen += i; - outbuf[outlen] = '\0'; - // TODO: avoid reallocation ??? - RETVAL_STRINGL((char *)outbuf, outlen); - efree(outbuf); + outbuf->val[outlen] = '\0'; + outbuf->len = outlen; + RETVAL_STR(outbuf); } else { - efree(outbuf); + STR_RELEASE(outbuf); RETVAL_FALSE; } if (key != (unsigned char*)password) { @@ -5241,7 +5222,7 @@ PHP_FUNCTION(openssl_dh_compute_key) int pub_len; EVP_PKEY *pkey; BIGNUM *pub; - char *data; + zend_string *data; int len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sr", &pub_str, &pub_len, &key) == FAILURE) { @@ -5254,16 +5235,15 @@ PHP_FUNCTION(openssl_dh_compute_key) pub = BN_bin2bn((unsigned char*)pub_str, pub_len, NULL); - data = emalloc(DH_size(pkey->pkey.dh) + 1); - len = DH_compute_key((unsigned char*)data, pub, pkey->pkey.dh); + data = STR_ALLOC(DH_size(pkey->pkey.dh), 0); + len = DH_compute_key((unsigned char*)data->val, pub, pkey->pkey.dh); if (len >= 0) { - data[len] = 0; - // TODO: avoid reallocation ??? - RETVAL_STRINGL(data, len); - efree(data); + data->len = len; + data->val[len] = 0; + RETVAL_STR(data); } else { - efree(data); + STR_RELEASE(data); RETVAL_FALSE; } @@ -5276,7 +5256,7 @@ PHP_FUNCTION(openssl_dh_compute_key) PHP_FUNCTION(openssl_random_pseudo_bytes) { long buffer_length; - unsigned char *buffer = NULL; + zend_string *buffer = NULL; zval *zstrong_result_returned = NULL; int strong_result = 0; @@ -5293,21 +5273,21 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) ZVAL_BOOL(zstrong_result_returned, 0); } - buffer = emalloc(buffer_length + 1); + buffer = STR_ALLOC(buffer_length, 0); #ifdef PHP_WIN32 strong_result = 1; /* random/urandom equivalent on Windows */ - if (php_win32_get_random_bytes(buffer, (size_t) buffer_length) == FAILURE){ - efree(buffer); + if (php_win32_get_random_bytes((unsigned char*)buffer->val, (size_t) buffer_length) == FAILURE){ + STR_RELEASE(buffer); if (zstrong_result_returned) { ZVAL_BOOL(zstrong_result_returned, 0); } RETURN_FALSE; } #else - if ((strong_result = RAND_pseudo_bytes(buffer, buffer_length)) < 0) { - efree(buffer); + if ((strong_result = RAND_pseudo_bytes((unsigned char*)buffer->val, buffer_length)) < 0) { + STR_RELEASE(buffer); if (zstrong_result_returned) { ZVAL_BOOL(zstrong_result_returned, 0); } @@ -5315,10 +5295,8 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) } #endif - buffer[buffer_length] = 0; - // TODO: avoid reallocation ??? - RETVAL_STRINGL((char *)buffer, buffer_length); - efree(buffer); + buffer->val[buffer_length] = 0; + RETVAL_STR(buffer); if (zstrong_result_returned) { ZVAL_BOOL(zstrong_result_returned, strong_result); diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 8fdbf2845f..f706e0d5a2 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -75,7 +75,7 @@ #define PHP_X509_NAME_ENTRY_TO_UTF8(ne, i, out) ASN1_STRING_to_UTF8(&out, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(ne, i))) extern php_stream* php_openssl_get_stream_from_ssl_handle(const SSL *ssl); -extern int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len TSRMLS_DC); +extern zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw TSRMLS_DC); extern int php_openssl_get_ssl_stream_data_index(); extern int php_openssl_get_x509_list_id(void); @@ -265,13 +265,13 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected TSRMLS_DC) { - char *fingerprint; - int fingerprint_len; + zend_string *fingerprint; int result = -1; - if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { - result = strcmp(expected, fingerprint); - efree(fingerprint); + fingerprint = php_openssl_x509_fingerprint(peer, method, 0 TSRMLS_CC); + if (fingerprint) { + result = strcmp(expected, fingerprint->val); + STR_RELEASE(fingerprint); } return result; @@ -1947,7 +1947,6 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ clisock = php_network_accept_incoming(sock->s.socket, xparam->want_textaddr ? &xparam->outputs.textaddr : NULL, - xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL, xparam->want_addr ? &xparam->outputs.addr : NULL, xparam->want_addr ? &xparam->outputs.addrlen : NULL, xparam->inputs.timeout, diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index e620227a22..2828b96e81 100644 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -36,22 +36,20 @@ static int pdo_odbc_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *inf pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data; pdo_odbc_errinfo *einfo = &H->einfo; pdo_odbc_stmt *S = NULL; - char *message = NULL; + zend_string *message = NULL; if (stmt) { S = (pdo_odbc_stmt*)stmt->driver_data; einfo = &S->einfo; } - spprintf(&message, 0, "%s (%s[%ld] at %s:%d)", + message = strpprintf(0, "%s (%s[%ld] at %s:%d)", einfo->last_err_msg, einfo->what, einfo->last_error, einfo->file, einfo->line); add_next_index_long(info, einfo->last_error); - // TODO: avoid reallocation ??? - add_next_index_string(info, message); - efree(message); + add_next_index_str(info, message); add_next_index_string(info, einfo->last_state); return 1; diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index bfe17e6a13..632a94ae62 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -84,17 +84,12 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char } if (NULL != (stuff = zend_hash_str_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED")-1))) { - char *str = NULL; - int len; - - // TODO: avoid reallocation ??? - len = spprintf(&str, 4096, "phar://%s%s", fname, entry); + zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry); ZVAL_STR(&temp, Z_STR_P(stuff)); - ZVAL_STRINGL(stuff, str, len); - efree(str); + ZVAL_STR(stuff, str); - zend_hash_str_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED")-1, (void *) &temp); + zend_hash_str_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED")-1, &temp); } if (!PHAR_GLOBALS->phar_SERVER_mung_list) { @@ -136,15 +131,10 @@ static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_FILENAME) { if (NULL != (stuff = zend_hash_str_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1))) { - char *str = NULL; - int len; - - // TODO: avoid reallocation ??? - len = spprintf(&str, 4096, "phar://%s%s", fname, entry); + zend_string *str = strpprintf(4096, "phar://%s%s", fname, entry); ZVAL_STR(&temp, Z_STR_P(stuff)); - ZVAL_STRINGL(stuff, str, len); - efree(str); + ZVAL_STR(stuff, str); zend_hash_str_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME")-1, &temp); } @@ -3033,8 +3023,7 @@ PHP_METHOD(Phar, getSignature) } if (phar_obj->archive->signature) { - char *unknown; - int unknown_len; + zend_string *unknown; array_init(return_value); add_assoc_stringl(return_value, "hash", phar_obj->archive->signature, phar_obj->archive->sig_len); @@ -3055,10 +3044,8 @@ PHP_METHOD(Phar, getSignature) add_assoc_stringl(return_value, "hash_type", "OpenSSL", 7); break; default: - unknown_len = spprintf(&unknown, 0, "Unknown (%u)", phar_obj->archive->sig_flags); - // TODO: avoid reallocation ??? - add_assoc_stringl(return_value, "hash_type", unknown, unknown_len); - efree(unknown); + unknown = strpprintf(0, "Unknown (%u)", phar_obj->archive->sig_flags); + add_assoc_str(return_value, "hash_type", unknown); break; } } else { @@ -3520,6 +3507,7 @@ PHP_METHOD(Phar, offsetGet) zval zfname; phar_entry_info *entry; PHAR_ARCHIVE_OBJECT(); + zend_string *sfname; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname, &fname_len) == FAILURE) { return; @@ -3549,10 +3537,8 @@ PHP_METHOD(Phar, offsetGet) efree(entry); } - fname_len = spprintf(&fname, 0, "phar://%s/%s", phar_obj->archive->fname, fname); - /* TODO: avoid reallocation ??? */ - ZVAL_STRINGL(&zfname, fname, fname_len); - efree(fname); + sfname = strpprintf(0, "phar://%s/%s", phar_obj->archive->fname, fname); + ZVAL_STR(&zfname, sfname); spl_instantiate_arg_ex1(phar_obj->spl.info_class, return_value, &zfname TSRMLS_CC); zval_ptr_dtor(&zfname); } @@ -3837,7 +3823,7 @@ PHP_METHOD(Phar, addFromString) PHP_METHOD(Phar, getStub) { size_t len; - char *buf; + zend_string *buf; php_stream *fp; php_stream_filter *filter = NULL; phar_entry_info *stub; @@ -3903,15 +3889,15 @@ PHP_METHOD(Phar, getStub) php_stream_rewind(fp); carry_on: - buf = safe_emalloc(len, 1, 1); + buf = STR_ALLOC(len, 0); - if (len != php_stream_read(fp, buf, len)) { + if (len != php_stream_read(fp, buf->val, len)) { if (fp != phar_obj->archive->fp) { php_stream_close(fp); } zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Unable to read stub"); - efree(buf); + STR_RELEASE(buf); return; } @@ -3924,10 +3910,9 @@ carry_on: php_stream_close(fp); } - buf[len] = '\0'; - // TODO: avoid reallocation ??? - RETVAL_STRINGL(buf, len); - efree(buf); + buf->val[len] = '\0'; + buf->len = len; + RETVAL_STR(buf); } /* }}}*/ diff --git a/ext/phar/util.c b/ext/phar/util.c index 4d260a4c13..4bac776511 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1510,11 +1510,6 @@ int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_typ pfp = php_stream_open_wrapper(pfile, "rb", 0, NULL); efree(pfile); -//???#if PHP_MAJOR_VERSION > 5 -//??? if (!pfp || !(pubkey_len = php_stream_copy_to_mem(pfp, (void **) &pubkey, PHP_STREAM_COPY_ALL, 0)) || !pubkey) { -//???#else -//??? if (!pfp || !(pubkey_len = php_stream_copy_to_mem(pfp, &pubkey, PHP_STREAM_COPY_ALL, 0)) || !pubkey) { -//???#endif if (!pfp || !(pubkey = php_stream_copy_to_mem(pfp, PHP_STREAM_COPY_ALL, 0)) || !pubkey->len) { if (pfp) { php_stream_close(pfp); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index fd7569bcb8..4248de834d 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1799,8 +1799,7 @@ ZEND_METHOD(reflection_function, getFileName) } GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION) { -// TODO: we have to duplicate it, becaise it may be in opcache SHM ??? - RETURN_STR(STR_DUP(fptr->op_array.filename, 0)); + RETURN_STR(STR_COPY(fptr->op_array.filename)); } RETURN_FALSE; } @@ -1854,8 +1853,7 @@ ZEND_METHOD(reflection_function, getDocComment) } GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION && fptr->op_array.doc_comment) { -// TODO: we have to duplicate it, becaise it may be stored in opcache SHM ??? - RETURN_STR(STR_DUP(fptr->op_array.doc_comment, 0)); + RETURN_STR(STR_COPY(fptr->op_array.doc_comment)); } RETURN_FALSE; } @@ -3451,8 +3449,6 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) zend_class_entry *ce; zend_string *name; zval *variable_ptr, *value; -//??? int refcount; -//??? zend_uchar is_ref; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Sz", &name, &value) == FAILURE) { return; @@ -3467,13 +3463,8 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) "Class %s does not have a property named %s", ce->name->val, name->val); return; } -//??? refcount = Z_REFCOUNT_PP(variable_ptr); -//??? is_ref = Z_ISREF_PP(variable_ptr); - zval_dtor(variable_ptr); - ZVAL_DUP(variable_ptr, value); -//??? Z_SET_REFCOUNT_PP(variable_ptr, refcount); -//??? Z_SET_ISREF_TO_PP(variable_ptr, is_ref); - + zval_ptr_dtor(variable_ptr); + ZVAL_COPY(variable_ptr, value); } /* }}} */ @@ -3566,8 +3557,7 @@ ZEND_METHOD(reflection_class, getFileName) } GET_REFLECTION_OBJECT_PTR(ce); if (ce->type == ZEND_USER_CLASS) { -// TODO: we have to duplicate it, becaise it may be stored in opcache SHM ??? - RETURN_STR(STR_DUP(ce->info.user.filename, 0)); + RETURN_STR(STR_COPY(ce->info.user.filename)); } RETURN_FALSE; } diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index 1fa386043d..bb2a6c7a53 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -995,8 +995,7 @@ try_again: add_index_string(&zcookie, 2, phpurl->host); } - // TODO: avoid reallocation ??? - add_assoc_zval_ex(cookies, name.s->val, name.s->len, &zcookie); + zend_symtable_update(Z_ARRVAL_P(cookies), name.s, &zcookie); smart_str_free(&name); } diff --git a/ext/soap/soap.c b/ext/soap/soap.c index ec2c2f0c17..a1d2ca4f48 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -928,8 +928,7 @@ PHP_METHOD(SoapFault, SoapFault) PHP_METHOD(SoapFault, __toString) { zval *faultcode, *faultstring, *file, *line, trace; - char *str; - int len; + zend_string *str; zend_fcall_info fci; zval *this_ptr; @@ -957,15 +956,13 @@ PHP_METHOD(SoapFault, __toString) zval_ptr_dtor(&fci.function_name); - len = spprintf(&str, 0, "SoapFault exception: [%s] %s in %s:%ld\nStack trace:\n%s", + str = strpprintf(0, "SoapFault exception: [%s] %s in %s:%ld\nStack trace:\n%s", Z_STRVAL_P(faultcode), Z_STRVAL_P(faultstring), Z_STRVAL_P(file), Z_LVAL_P(line), Z_STRLEN(trace) ? Z_STRVAL(trace) : "#0 {main}\n"); zval_ptr_dtor(&trace); - // TODO: avoid reallocation ??? - RETVAL_STRINGL(str, len); - efree(str); + RETVAL_STR(str); } /* }}} */ diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 8796a9c7a7..e503f9b581 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1958,7 +1958,6 @@ SPL_METHOD(RecursiveCallbackFilterIterator, getChildren) return; } -//??? intern = Z_SPLDUAL_IT_P(getThis()); SPL_FETCH_AND_CHECK_DUAL_IT(intern, getThis()); zend_call_method_with_0_params(&intern->inner.zobject, intern->inner.ce, NULL, "getchildren", &retval); @@ -2686,13 +2685,8 @@ static inline void spl_caching_it_next(spl_dual_it_object *intern TSRMLS_DC) } use_copy = zend_make_printable_zval(&intern->u.caching.zstr, &expr_copy TSRMLS_CC); if (use_copy) { - ZVAL_COPY(&intern->u.caching.zstr, &expr_copy); -//??? INIT_PZVAL(intern->u.caching.zstr); - //zval_copy_ctor(&intern->u.caching.zstr); - zval_dtor(&expr_copy); + ZVAL_COPY_VALUE(&intern->u.caching.zstr, &expr_copy); } else if (Z_REFCOUNTED(intern->u.caching.zstr)) { -//??? INIT_PZVAL(intern->u.caching.zstr); - //zval_copy_ctor(&intern->u.caching.zstr); Z_ADDREF(intern->u.caching.zstr); } } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index e11bb84056..300df8c1c0 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -43,7 +43,7 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) int err; char *hostname = NULL; long hostname_len; - char *errstr = NULL; + zend_string *errstr = NULL; RETVAL_FALSE; @@ -83,7 +83,7 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) efree(hostname); } if (stream == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s:%ld (%s)", host, port, errstr == NULL ? "Unknown error" : errstr); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s:%ld (%s)", host, port, errstr == NULL ? "Unknown error" : errstr->val); } if (hashkey) { @@ -98,18 +98,16 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (zerrstr && errstr) { /* no need to dup; we need to efree buf anyway */ zval_dtor(zerrstr); - // TODO: avoid reallocation ??? - ZVAL_STRING(zerrstr, errstr); - efree(errstr); + ZVAL_STR(zerrstr, errstr); } else if (!zerrstr && errstr) { - efree(errstr); + STR_RELEASE(errstr); } RETURN_FALSE; } if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } php_stream_to_zval(stream, return_value); diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index 1007b16123..73952dda31 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -130,7 +130,8 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char tmp_line[128]; size_t chunk_size = 0, file_size = 0; int eol_detect = 0; - char *transport_string, *errstr = NULL; + char *transport_string; + zend_string *errstr = NULL; int transport_len, have_header = 0, request_fulluri = 0, ignore_errors = 0; char *protocol_version = NULL; int protocol_version_len = 3; /* Default: "1.0" */ @@ -216,8 +217,8 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, } if (errstr) { - php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "%s", errstr); - efree(errstr); + php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "%s", errstr->val); + STR_RELEASE(errstr); errstr = NULL; } diff --git a/ext/standard/info.c b/ext/standard/info.c index 67ca2adee0..47249466b0 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -855,7 +855,6 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) HashTable sorted_registry; zend_hash_init(&sorted_registry, zend_hash_num_elements(&module_registry), NULL, NULL, 1); -//??? zend_hash_copy(&sorted_registry, &module_registry, NULL, &tmp, sizeof(zend_module_entry)); zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, zend_qsort, module_name_cmp, 0 TSRMLS_CC); diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 9ba10edb13..652512ce07 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -97,7 +97,7 @@ PHP_FUNCTION(stream_socket_client) php_stream *stream = NULL; int err; long flags = PHP_STREAM_CLIENT_CONNECT; - char *errstr = NULL; + zend_string *errstr = NULL; php_stream_context *context = NULL; RETVAL_FALSE; @@ -140,7 +140,7 @@ PHP_FUNCTION(stream_socket_client) /* host might contain binary characters */ zend_string *quoted_host = php_addslashes(host, host_len, 0 TSRMLS_CC); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", quoted_host->val, errstr == NULL ? "Unknown error" : errstr); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", quoted_host->val, errstr == NULL ? "Unknown error" : errstr->val); STR_RELEASE(quoted_host); } @@ -154,19 +154,16 @@ PHP_FUNCTION(stream_socket_client) ZVAL_LONG(zerrno, err); } if (zerrstr && errstr) { - /* no need to dup; we need to efree buf anyway */ zval_dtor(zerrstr); - // TODO: avoid reallocation ??? - ZVAL_STRING(zerrstr, errstr); - efree(errstr); + ZVAL_STR(zerrstr, errstr); } else if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } RETURN_FALSE; } if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } php_stream_to_zval(stream, return_value); @@ -184,7 +181,7 @@ PHP_FUNCTION(stream_socket_server) php_stream *stream = NULL; int err = 0; long flags = STREAM_XPORT_BIND | STREAM_XPORT_LISTEN; - char *errstr = NULL; + zend_string *errstr = NULL; php_stream_context *context = NULL; RETVAL_FALSE; @@ -213,7 +210,7 @@ PHP_FUNCTION(stream_socket_server) NULL, NULL, context, &errstr, &err); if (stream == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : errstr); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : errstr->val); } if (stream == NULL) { @@ -222,19 +219,16 @@ PHP_FUNCTION(stream_socket_server) ZVAL_LONG(zerrno, err); } if (zerrstr && errstr) { - /* no need to dup; we need to efree buf anyway */ zval_dtor(zerrstr); - // TODO: avoid reallocation ??? - ZVAL_STRING(zerrstr, errstr); - efree(errstr); + ZVAL_STR(zerrstr, errstr); } else if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } RETURN_FALSE; } if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } php_stream_to_zval(stream, return_value); @@ -247,14 +241,12 @@ PHP_FUNCTION(stream_socket_accept) { double timeout = FG(default_socket_timeout); zval *zpeername = NULL; - char *peername = NULL; - int peername_len; + zend_string *peername = NULL; php_timeout_ull conv; struct timeval tv; php_stream *stream = NULL, *clistream = NULL; zval *zstream; - - char *errstr = NULL; + zend_string *errstr = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|dz/", &zstream, &timeout, &zpeername) == FAILURE) { RETURN_FALSE; @@ -278,24 +270,21 @@ PHP_FUNCTION(stream_socket_accept) if (0 == php_stream_xport_accept(stream, &clistream, zpeername ? &peername : NULL, - zpeername ? &peername_len : NULL, NULL, NULL, &tv, &errstr TSRMLS_CC) && clistream) { if (peername) { - // TODO: avoid reallocation ??? - ZVAL_STRINGL(zpeername, peername, peername_len); - efree(peername); + ZVAL_STR(zpeername, peername); } php_stream_to_zval(clistream, return_value); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "accept failed: %s", errstr ? errstr : "Unknown error"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "accept failed: %s", errstr ? errstr->val : "Unknown error"); RETVAL_FALSE; } if (errstr) { - efree(errstr); + STR_RELEASE(errstr); } } /* }}} */ @@ -307,8 +296,7 @@ PHP_FUNCTION(stream_socket_get_name) php_stream *stream; zval *zstream; zend_bool want_peer; - char *name = NULL; - int name_len; + zend_string *name = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &zstream, &want_peer) == FAILURE) { RETURN_FALSE; @@ -318,15 +306,12 @@ PHP_FUNCTION(stream_socket_get_name) if (0 != php_stream_xport_get_name(stream, want_peer, &name, - &name_len, NULL, NULL TSRMLS_CC)) { RETURN_FALSE; } - // TODO: avoid reallocation ??? - RETVAL_STRINGL(name, name_len); - efree(name); + RETVAL_STR(name); } /* }}} */ @@ -365,8 +350,7 @@ PHP_FUNCTION(stream_socket_recvfrom) { php_stream *stream; zval *zstream, *zremote = NULL; - char *remote_addr = NULL; - int remote_addr_len; + zend_string *remote_addr = NULL; long to_read = 0; zend_string *read_buf; long flags = 0; @@ -391,15 +375,12 @@ PHP_FUNCTION(stream_socket_recvfrom) read_buf = STR_ALLOC(to_read, 0); recvd = php_stream_xport_recvfrom(stream, read_buf->val, to_read, flags, NULL, NULL, - zremote ? &remote_addr : NULL, - zremote ? &remote_addr_len : NULL + zremote ? &remote_addr : NULL TSRMLS_CC); if (recvd >= 0) { if (zremote) { - // TODO: avoid reallocation ??? - ZVAL_STRINGL(zremote, remote_addr, remote_addr_len); - efree(remote_addr); + ZVAL_STR(zremote, remote_addr); } read_buf->val[recvd] = '\0'; read_buf->len = recvd; diff --git a/ext/standard/string.c b/ext/standard/string.c index 5f4f360ca6..82b98eb094 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -146,41 +146,43 @@ static zend_string *php_bin2hex(const unsigned char *old, const size_t oldlen) /* {{{ php_hex2bin */ -static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen) +static zend_string *php_hex2bin(const unsigned char *old, const size_t oldlen) { size_t target_length = oldlen >> 1; - register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1); + zend_string *str = STR_ALLOC(target_length, 0); + unsigned char *ret = (unsigned char *)str->val; size_t i, j; + for (i = j = 0; i < target_length; i++) { - char c = old[j++]; + unsigned char c = old[j++]; + unsigned char d; + if (c >= '0' && c <= '9') { - str[i] = (c - '0') << 4; + d = (c - '0') << 4; } else if (c >= 'a' && c <= 'f') { - str[i] = (c - 'a' + 10) << 4; + d = (c - 'a' + 10) << 4; } else if (c >= 'A' && c <= 'F') { - str[i] = (c - 'A' + 10) << 4; + d = (c - 'A' + 10) << 4; } else { - efree(str); + STR_FREE(str); return NULL; } c = old[j++]; if (c >= '0' && c <= '9') { - str[i] |= c - '0'; + d |= c - '0'; } else if (c >= 'a' && c <= 'f') { - str[i] |= c - 'a' + 10; + d |= c - 'a' + 10; } else if (c >= 'A' && c <= 'F') { - str[i] |= c - 'A' + 10; + d |= c - 'A' + 10; } else { - efree(str); + STR_FREE(str); return NULL; } + ret[i] = d; } - str[target_length] = '\0'; - - if (newlen) - *newlen = target_length; + ret[i] = '\0'; - return (char *)str; + return str; } /* }}} */ @@ -256,29 +258,25 @@ PHP_FUNCTION(bin2hex) Converts the hex representation of data to binary */ PHP_FUNCTION(hex2bin) { - char *result, *data; - size_t newlen; - int datalen; + zend_string *result, *data; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &datalen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &data) == FAILURE) { return; } - if (datalen % 2 != 0) { + if (data->len % 2 != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hexadecimal input string must have an even length"); RETURN_FALSE; } - result = php_hex2bin((unsigned char *)data, datalen, &newlen); + result = php_hex2bin((unsigned char *)data->val, data->len); if (!result) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input string must be hexadecimal string"); RETURN_FALSE; } - // TODO: avoid reallocation ??? - RETVAL_STRINGL(result, newlen); - efree(result); + RETVAL_STR(result); } /* }}} */ @@ -2457,7 +2455,7 @@ PHP_FUNCTION(substr_replace) orig_str = tmp_str; } - /* + /*??? refcount = Z_REFCOUNT_P(orig_str); */ @@ -2528,7 +2526,7 @@ PHP_FUNCTION(substr_replace) } else { repl_str = tmp_repl; } - /* + /*??? if (Z_REFCOUNT_P(orig_str) != refcount) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument was modified while replacing"); if (Z_TYPE_P(tmp_repl) != IS_STRING) { @@ -3375,7 +3373,7 @@ PHPAPI zend_string *php_addcslashes(const char *str, int length, int should_free new_str = STR_REALLOC(new_str, newlen, 0); } if (should_free) { -//??? STR_FREE((char*)str); + efree((char*)str); } return new_str; } @@ -3420,7 +3418,7 @@ PHPAPI zend_string *php_addslashes(char *str, int length, int should_free TSRMLS *target = 0; if (should_free) { -//??? STR_FREE(str); + efree(str); } new_str = STR_REALLOC(new_str, target - new_str->val, 0); diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index e0b728c882..7dce126ac3 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -340,7 +340,6 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, /* create the object */ object_init_ex(&obj, fdat->ce); -//??? Z_SET_ISREF_P(obj); /* filtername */ add_property_string(&obj, "filtername", (char*)filtername); diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index 0a5cbaa2cb..b6fcd79c2d 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -183,24 +183,24 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) /* }}} */ -static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen) +static zend_string *unserialize_str(const unsigned char **p, size_t len, size_t maxlen) { size_t i, j; - char *str = safe_emalloc(*len, 1, 1); + zend_string *str = STR_ALLOC(len, 0); unsigned char *end = *(unsigned char **)p+maxlen; if (end < *p) { - efree(str); + STR_FREE(str); return NULL; } - for (i = 0; i < *len; i++) { + for (i = 0; i < len; i++) { if (*p >= end) { - efree(str); + STR_FREE(str); return NULL; } if (**p != '\\') { - str[i] = (char)**p; + str->val[i] = (char)**p; } else { unsigned char ch = 0; @@ -213,16 +213,16 @@ static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen } else if (**p >= 'A' && **p <= 'F') { ch = (ch << 4) + (**p -'A'+10); } else { - efree(str); + STR_FREE(str); return NULL; } } - str[i] = (char)ch; + str->val[i] = (char)ch; } (*p)++; } - str[i] = 0; - *len = i; + str->val[i] = 0; + str->len = i; return str; } @@ -541,7 +541,7 @@ yy2: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy95; yy3: -#line 829 "ext/standard/var_unserializer.re" +#line 826 "ext/standard/var_unserializer.re" { return 0; } #line 547 "ext/standard/var_unserializer.c" yy4: @@ -586,7 +586,7 @@ yy13: goto yy3; yy14: ++YYCURSOR; -#line 823 "ext/standard/var_unserializer.re" +#line 820 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data"); @@ -622,7 +622,7 @@ yy20: yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 684 "ext/standard/var_unserializer.re" +#line 681 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; long elements; @@ -786,7 +786,7 @@ yy27: yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 676 "ext/standard/var_unserializer.re" +#line 673 "ext/standard/var_unserializer.re" { //??? INIT_PZVAL(rval); @@ -815,7 +815,7 @@ yy34: yych = *++YYCURSOR; if (yych != '{') goto yy18; ++YYCURSOR; -#line 655 "ext/standard/var_unserializer.re" +#line 652 "ext/standard/var_unserializer.re" { long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -857,11 +857,10 @@ yy41: yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 625 "ext/standard/var_unserializer.re" +#line 624 "ext/standard/var_unserializer.re" { size_t len, maxlen; -//??? TODO: use zend_string* instead of char* - char *str; + zend_string *str; len = parse_uiv(start + 2); maxlen = max - YYCURSOR; @@ -870,12 +869,12 @@ yy41: return 0; } - if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) { + if ((str = unserialize_str(&YYCURSOR, len, maxlen)) == NULL) { return 0; } if (*(YYCURSOR) != '"') { - efree(str); + STR_FREE(str); *p = YYCURSOR; return 0; } @@ -883,11 +882,10 @@ yy41: YYCURSOR += 2; *p = YYCURSOR; - ZVAL_STRINGL(rval, str, len); - efree(str); + ZVAL_STR(rval, str); return 1; } -#line 891 "ext/standard/var_unserializer.c" +#line 889 "ext/standard/var_unserializer.c" yy46: yych = *++YYCURSOR; if (yych == '+') goto yy47; @@ -908,7 +906,7 @@ yy48: yych = *++YYCURSOR; if (yych != '"') goto yy18; ++YYCURSOR; -#line 598 "ext/standard/var_unserializer.re" +#line 597 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -935,7 +933,7 @@ yy48: ZVAL_STRINGL(rval, str, len); return 1; } -#line 939 "ext/standard/var_unserializer.c" +#line 937 "ext/standard/var_unserializer.c" yy53: yych = *++YYCURSOR; if (yych <= '/') { @@ -1023,7 +1021,7 @@ yy61: } yy63: ++YYCURSOR; -#line 589 "ext/standard/var_unserializer.re" +#line 588 "ext/standard/var_unserializer.re" { #if SIZEOF_LONG == 4 use_double: @@ -1032,7 +1030,7 @@ use_double: ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 1036 "ext/standard/var_unserializer.c" +#line 1034 "ext/standard/var_unserializer.c" yy65: yych = *++YYCURSOR; if (yych <= ',') { @@ -1091,7 +1089,7 @@ yy73: yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 573 "ext/standard/var_unserializer.re" +#line 572 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1107,7 +1105,7 @@ yy73: return 1; } -#line 1111 "ext/standard/var_unserializer.c" +#line 1109 "ext/standard/var_unserializer.c" yy76: yych = *++YYCURSOR; if (yych == 'N') goto yy73; @@ -1134,7 +1132,7 @@ yy79: if (yych <= '9') goto yy79; if (yych != ';') goto yy18; ++YYCURSOR; -#line 547 "ext/standard/var_unserializer.re" +#line 546 "ext/standard/var_unserializer.re" { #if SIZEOF_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1160,7 +1158,7 @@ yy79: ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1164 "ext/standard/var_unserializer.c" +#line 1162 "ext/standard/var_unserializer.c" yy83: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1168,22 +1166,22 @@ yy83: yych = *++YYCURSOR; if (yych != ';') goto yy18; ++YYCURSOR; -#line 541 "ext/standard/var_unserializer.re" +#line 540 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_BOOL(rval, parse_iv(start + 2)); return 1; } -#line 1178 "ext/standard/var_unserializer.c" +#line 1176 "ext/standard/var_unserializer.c" yy87: ++YYCURSOR; -#line 535 "ext/standard/var_unserializer.re" +#line 534 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 1187 "ext/standard/var_unserializer.c" +#line 1185 "ext/standard/var_unserializer.c" yy89: yych = *++YYCURSOR; if (yych <= ',') { @@ -1206,7 +1204,7 @@ yy91: if (yych <= '9') goto yy91; if (yych != ';') goto yy18; ++YYCURSOR; -#line 512 "ext/standard/var_unserializer.re" +#line 511 "ext/standard/var_unserializer.re" { long id; @@ -1229,7 +1227,7 @@ yy91: return 1; } -#line 1233 "ext/standard/var_unserializer.c" +#line 1231 "ext/standard/var_unserializer.c" yy95: yych = *++YYCURSOR; if (yych <= ',') { @@ -1271,13 +1269,12 @@ yy97: ZVAL_NEW_REF(rval_ref, rval_ref); ZVAL_COPY(rval, rval_ref); } -//??? Z_SET_ISREF_PP(rval); return 1; } -#line 1279 "ext/standard/var_unserializer.c" +#line 1276 "ext/standard/var_unserializer.c" } -#line 831 "ext/standard/var_unserializer.re" +#line 828 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index af9da9c6a8..5636429c8b 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -181,24 +181,24 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) /* }}} */ -static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen) +static zend_string *unserialize_str(const unsigned char **p, size_t len, size_t maxlen) { size_t i, j; - char *str = safe_emalloc(*len, 1, 1); + zend_string *str = STR_ALLOC(len, 0); unsigned char *end = *(unsigned char **)p+maxlen; if (end < *p) { - efree(str); + STR_FREE(str); return NULL; } - for (i = 0; i < *len; i++) { + for (i = 0; i < len; i++) { if (*p >= end) { - efree(str); + STR_FREE(str); return NULL; } if (**p != '\\') { - str[i] = (char)**p; + str->val[i] = (char)**p; } else { unsigned char ch = 0; @@ -211,16 +211,16 @@ static char *unserialize_str(const unsigned char **p, size_t *len, size_t maxlen } else if (**p >= 'A' && **p <= 'F') { ch = (ch << 4) + (**p -'A'+10); } else { - efree(str); + STR_FREE(str); return NULL; } } - str[i] = (char)ch; + str->val[i] = (char)ch; } (*p)++; } - str[i] = 0; - *len = i; + str->val[i] = 0; + str->len = i; return str; } @@ -504,7 +504,6 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER) ZVAL_NEW_REF(rval_ref, rval_ref); ZVAL_COPY(rval, rval_ref); } -//??? Z_SET_ISREF_PP(rval); return 1; } @@ -624,8 +623,7 @@ use_double: "S:" uiv ":" ["] { size_t len, maxlen; -//??? TODO: use zend_string* instead of char* - char *str; + zend_string *str; len = parse_uiv(start + 2); maxlen = max - YYCURSOR; @@ -634,12 +632,12 @@ use_double: return 0; } - if ((str = unserialize_str(&YYCURSOR, &len, maxlen)) == NULL) { + if ((str = unserialize_str(&YYCURSOR, len, maxlen)) == NULL) { return 0; } if (*(YYCURSOR) != '"') { - efree(str); + STR_FREE(str); *p = YYCURSOR; return 0; } @@ -647,8 +645,7 @@ use_double: YYCURSOR += 2; *p = YYCURSOR; - ZVAL_STRINGL(rval, str, len); - efree(str); + ZVAL_STR(rval, str); return 1; } diff --git a/ext/xml/xml.c b/ext/xml/xml.c index bbceb6dcf2..2886d6c686 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -290,7 +290,7 @@ static int le_xml_parser; /* {{{ startup, shutdown and info functions */ static PHP_GINIT_FUNCTION(xml) { - xml_globals->default_encoding = "UTF-8"; + xml_globals->default_encoding = (XML_Char*)"UTF-8"; } static void *php_xml_malloc_wrapper(size_t sz) @@ -727,11 +727,13 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch array_init(&args[2]); while (attributes && *attributes) { + zval tmp; + att = _xml_decode_tag(parser, (const char *)attributes[0]); val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); - // TODO: avoid reallocation ??? - add_assoc_str(&args[2], att->val, val); + ZVAL_STR(&tmp, val); + zend_symtable_update(Z_ARRVAL(args[2]), att, &tmp); attributes += 2; @@ -762,11 +764,13 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch attributes = (const XML_Char **) attrs; while (attributes && *attributes) { + zval tmp; + att = _xml_decode_tag(parser, (const char *)attributes[0]); val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); - // TODO: avoid reallocation ??? - add_assoc_str(&atr, att->val, val); + ZVAL_STR(&tmp, val); + zend_symtable_update(Z_ARRVAL(atr), att, &tmp); atcnt++; attributes += 2; @@ -889,7 +893,6 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) decoded_value->val, decoded_value->len + 1); STR_RELEASE(decoded_value); } else { - // TODO: avoid reallocation ??? add_assoc_str(parser->ctag, "value", decoded_value); } @@ -919,7 +922,6 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) _xml_add_to_info(parser,parser->ltags[parser->level-1] + parser->toffset); add_assoc_string(&tag, "tag", parser->ltags[parser->level-1] + parser->toffset); - // TODO: avoid reallocation ??? add_assoc_str(&tag, "value", decoded_value); add_assoc_string(&tag, "type", "cdata"); add_assoc_long(&tag, "level", parser->level); @@ -1109,11 +1111,11 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp encoding = XML(default_encoding); auto_detect = 1; } else if (strcasecmp(encoding_param, "ISO-8859-1") == 0) { - encoding = "ISO-8859-1"; + encoding = (XML_Char*)"ISO-8859-1"; } else if (strcasecmp(encoding_param, "UTF-8") == 0) { - encoding = "UTF-8"; + encoding = (XML_Char*)"UTF-8"; } else if (strcasecmp(encoding_param, "US-ASCII") == 0) { - encoding = "US-ASCII"; + encoding = (XML_Char*)"US-ASCII"; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", encoding_param); RETURN_FALSE; @@ -1128,7 +1130,7 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp parser = ecalloc(1, sizeof(xml_parser)); parser->parser = XML_ParserCreate_MM((auto_detect ? NULL : encoding), - &php_xml_mem_hdlrs, ns_param); + &php_xml_mem_hdlrs, (XML_Char*)ns_param); parser->target_encoding = encoding; parser->case_folding = 1; @@ -1372,7 +1374,7 @@ PHP_FUNCTION(xml_parse) ZEND_FETCH_RESOURCE(parser, xml_parser *, pind, -1, "XML Parser", le_xml_parser); parser->isparsing = 1; - ret = XML_Parse(parser->parser, data, data_len, isFinal); + ret = XML_Parse(parser->parser, (XML_Char*)data, data_len, isFinal); parser->isparsing = 0; RETVAL_LONG(ret); } @@ -1417,7 +1419,7 @@ PHP_FUNCTION(xml_parse_into_struct) XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler); parser->isparsing = 1; - ret = XML_Parse(parser->parser, data, data_len, 1); + ret = XML_Parse(parser->parser, (XML_Char*)data, data_len, 1); parser->isparsing = 0; RETVAL_LONG(ret); @@ -1566,7 +1568,7 @@ PHP_FUNCTION(xml_parser_set_option) case PHP_XML_OPTION_TARGET_ENCODING: { xml_encoding *enc; convert_to_string_ex(val); - enc = xml_get_encoding(Z_STRVAL_P(val)); + enc = xml_get_encoding((XML_Char*)Z_STRVAL_P(val)); if (enc == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported target encoding \"%s\"", Z_STRVAL_P(val)); RETURN_FALSE; @@ -1625,7 +1627,7 @@ PHP_FUNCTION(utf8_encode) return; } - encoded = xml_utf8_encode(arg, arg_len, "ISO-8859-1"); + encoded = xml_utf8_encode(arg, arg_len, (XML_Char*)"ISO-8859-1"); if (encoded == NULL) { RETURN_FALSE; } @@ -1645,7 +1647,7 @@ PHP_FUNCTION(utf8_decode) return; } - decoded = xml_utf8_decode(arg, arg_len, "ISO-8859-1"); + decoded = xml_utf8_decode((XML_Char*)arg, arg_len, (XML_Char*)"ISO-8859-1"); if (decoded == NULL) { RETURN_FALSE; } diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index ad2e8a8d14..981c5c5a15 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -433,16 +433,18 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) if (!resolved_path) { if (SG(request_info).path_translated != filename) { -//??? STR_FREE(filename); - if (filename) efree(filename); + if (filename) { + efree(filename); + } } /* we have to free SG(request_info).path_translated here because * php_destroy_request_info assumes that it will get * freed when the include_names hash is emptied, but * we're not adding it in this case */ -//??? STR_FREE(SG(request_info).path_translated); - if (SG(request_info).path_translated) efree(SG(request_info).path_translated); - SG(request_info).path_translated = NULL; + if (SG(request_info).path_translated) { + efree(SG(request_info).path_translated); + SG(request_info).path_translated = NULL; + } return FAILURE; } efree(resolved_path); @@ -452,19 +454,22 @@ PHPAPI int php_fopen_primary_script(zend_file_handle *file_handle TSRMLS_DC) if (zend_stream_open(filename, file_handle TSRMLS_CC) == FAILURE) { PG(display_errors) = orig_display_errors; if (SG(request_info).path_translated != filename) { -//??? STR_FREE(filename); - if (filename) efree(filename); + if (filename) { + efree(filename); + } + } + if (SG(request_info).path_translated) { + efree(SG(request_info).path_translated); + SG(request_info).path_translated = NULL; } -//??? STR_FREE(SG(request_info).path_translated); /* for same reason as above */ - if (SG(request_info).path_translated) efree(SG(request_info).path_translated); - SG(request_info).path_translated = NULL; return FAILURE; } PG(display_errors) = orig_display_errors; if (SG(request_info).path_translated != filename) { -//??? STR_FREE(SG(request_info).path_translated); /* for same reason as above */ - if (SG(request_info).path_translated) efree(SG(request_info).path_translated); + if (SG(request_info).path_translated) { + efree(SG(request_info).path_translated); + } SG(request_info).path_translated = filename; } diff --git a/main/network.c b/main/network.c index ce88bf41ea..74855064d7 100644 --- a/main/network.c +++ b/main/network.c @@ -166,7 +166,7 @@ PHPAPI void php_network_freeaddresses(struct sockaddr **sal) /* {{{ php_network_getaddresses * Returns number of addresses, 0 for none/error */ -PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC) +PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, zend_string **error_string TSRMLS_DC) { struct sockaddr **sap; int n; @@ -212,16 +212,16 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka if ((n = getaddrinfo(host, NULL, &hints, &res))) { if (error_string) { - spprintf(error_string, 0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n)); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string); + *error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n)); } return 0; } else if (res == NULL) { if (error_string) { - spprintf(error_string, 0, "php_network_getaddresses: getaddrinfo failed (null result pointer) errno=%d", errno); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string); + *error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed (null result pointer) errno=%d", errno); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: getaddrinfo failed (null result pointer)"); } @@ -249,8 +249,8 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka host_info = gethostbyname(host); if (host_info == NULL) { if (error_string) { - spprintf(error_string, 0, "php_network_getaddresses: gethostbyname failed. errno=%d", errno); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string); + error_string = strpprintf(0, "php_network_getaddresses: gethostbyname failed. errno=%d", errno); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: gethostbyname failed"); } @@ -305,7 +305,7 @@ PHPAPI int php_network_connect_socket(php_socket_t sockfd, socklen_t addrlen, int asynchronous, struct timeval *timeout, - char **error_string, + zend_string **error_string, int *error_code) { #if HAVE_NON_BLOCKING_CONNECT @@ -326,7 +326,7 @@ PHPAPI int php_network_connect_socket(php_socket_t sockfd, if (error != EINPROGRESS) { if (error_string) { - *error_string = php_socket_strerror(error, NULL, 0); + *error_string = php_socket_error_str(error); } return -1; @@ -382,7 +382,7 @@ ok: if (error) { ret = -1; if (error_string) { - *error_string = php_socket_strerror(error, NULL, 0); + *error_string = php_socket_error_str(error); } } return ret; @@ -416,7 +416,7 @@ static inline void sub_times(struct timeval a, struct timeval b, struct timeval * */ /* {{{ php_network_bind_socket_to_local_addr */ php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port, - int socktype, long sockopts, char **error_string, int *error_code + int socktype, long sockopts, zend_string **error_string, int *error_code TSRMLS_DC) { int num_addrs, n, err = 0; @@ -495,7 +495,7 @@ php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned po *error_code = err; } if (error_string) { - *error_string = php_socket_strerror(err, NULL, 0); + *error_string = php_socket_error_str(err); } bound: @@ -516,7 +516,7 @@ PHPAPI int php_network_parse_network_address_with_port(const char *addr, long ad struct sockaddr_in *in4 = (struct sockaddr_in*)sa; struct sockaddr **psal; int n; - char *errstr = NULL; + zend_string *errstr = NULL; #if HAVE_IPV6 struct sockaddr_in6 *in6 = (struct sockaddr_in6*)sa; #endif @@ -562,9 +562,8 @@ PHPAPI int php_network_parse_network_address_with_port(const char *addr, long ad if (n == 0) { if (errstr) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to resolve `%s': %s", tmp, errstr); -//??? STR_FREE(errstr); - efree(errstr); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to resolve `%s': %s", tmp, errstr->val); + STR_RELEASE(errstr); } goto out; } @@ -590,7 +589,6 @@ PHPAPI int php_network_parse_network_address_with_port(const char *addr, long ad php_network_freeaddresses(psal); out: -//??? STR_FREE(tmp); efree(tmp); return ret; } @@ -600,7 +598,7 @@ PHPAPI void php_network_populate_name_from_sockaddr( /* input address */ struct sockaddr *sa, socklen_t sl, /* output readable address */ - char **textaddr, long *textaddrlen, + zend_string **textaddr, /* output address */ struct sockaddr **addr, socklen_t *addrlen @@ -623,7 +621,7 @@ PHPAPI void php_network_populate_name_from_sockaddr( /* generally not thread safe, but it *is* thread safe under win32 */ buf = inet_ntoa(((struct sockaddr_in*)sa)->sin_addr); if (buf) { - *textaddrlen = spprintf(textaddr, 0, "%s:%d", + *textaddr = strpprintf(0, "%s:%d", buf, ntohs(((struct sockaddr_in*)sa)->sin_port)); } @@ -633,7 +631,7 @@ PHPAPI void php_network_populate_name_from_sockaddr( case AF_INET6: buf = (char*)inet_ntop(sa->sa_family, &((struct sockaddr_in6*)sa)->sin6_addr, (char *)&abuf, sizeof(abuf)); if (buf) { - *textaddrlen = spprintf(textaddr, 0, "%s:%d", + *textaddr = strpprintf(0, "%s:%d", buf, ntohs(((struct sockaddr_in6*)sa)->sin6_port)); } @@ -647,13 +645,10 @@ PHPAPI void php_network_populate_name_from_sockaddr( if (ua->sun_path[0] == '\0') { /* abstract name */ int len = strlen(ua->sun_path + 1) + 1; - *textaddrlen = len; - *textaddr = emalloc(len + 1); - memcpy(*textaddr, ua->sun_path, len); - (*textaddr)[len] = '\0'; + *textaddr = STR_INIT((char*)ua->sun_path, len, 0); } else { - *textaddrlen = strlen(ua->sun_path); - *textaddr = estrndup(ua->sun_path, *textaddrlen); + int len = strlen(ua->sun_path); + *textaddr = STR_INIT((char*)ua->sun_path, len, 0); } } break; @@ -665,7 +660,7 @@ PHPAPI void php_network_populate_name_from_sockaddr( } PHPAPI int php_network_get_peer_name(php_socket_t sock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen TSRMLS_DC) @@ -676,7 +671,7 @@ PHPAPI int php_network_get_peer_name(php_socket_t sock, if (getpeername(sock, (struct sockaddr*)&sa, &sl) == 0) { php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, - textaddr, textaddrlen, + textaddr, addr, addrlen TSRMLS_CC); return 0; @@ -685,7 +680,7 @@ PHPAPI int php_network_get_peer_name(php_socket_t sock, } PHPAPI int php_network_get_sock_name(php_socket_t sock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen TSRMLS_DC) @@ -696,7 +691,7 @@ PHPAPI int php_network_get_sock_name(php_socket_t sock, if (getsockname(sock, (struct sockaddr*)&sa, &sl) == 0) { php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, - textaddr, textaddrlen, + textaddr, addr, addrlen TSRMLS_CC); return 0; @@ -710,17 +705,17 @@ PHPAPI int php_network_get_sock_name(php_socket_t sock, * using an optional timeout. * Returns the peer address in addr/addrlen (it will emalloc * these, so be sure to efree the result). - * If you specify textaddr/textaddrlen, a text-printable + * If you specify textaddr, a text-printable * version of the address will be emalloc'd and returned. * */ /* {{{ php_network_accept_incoming */ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen, struct timeval *timeout, - char **error_string, + zend_string **error_string, int *error_code TSRMLS_DC) { @@ -742,7 +737,7 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, if (clisock != SOCK_ERR) { php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, - textaddr, textaddrlen, + textaddr, addr, addrlen TSRMLS_CC); } else { @@ -754,7 +749,7 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, *error_code = error; } if (error_string) { - *error_string = php_socket_strerror(error, NULL, 0); + *error_string = php_socket_error_str(error); } return clisock; @@ -771,7 +766,7 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, /* {{{ php_network_connect_socket_to_host */ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port, - int socktype, int asynchronous, struct timeval *timeout, char **error_string, + int socktype, int asynchronous, struct timeval *timeout, zend_string **error_string, int *error_code, char *bindto, unsigned short bindport, long sockopts TSRMLS_DC) { @@ -885,7 +880,7 @@ skip_bind: } /* free error string received during previous iteration (if any) */ if (error_string && *error_string) { - efree(*error_string); + STR_RELEASE(*error_string); *error_string = NULL; } @@ -1046,6 +1041,44 @@ PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize) } /* }}} */ +/* {{{ php_socket_error_str */ +PHPAPI zend_string *php_socket_error_str(long err) +{ +#ifndef PHP_WIN32 + char *errstr; + + errstr = strerror(err); + return STR_INIT(errstr, strlen(errstr), 0); +#else + zend_string *ret; + char *sysbuf; + int free_it = 1; + + if (!FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&sysbuf, + 0, + NULL)) { + free_it = 0; + sysbuf = "Unknown Error"; + } + + ret = STR_INIT(sysbuf, strlen(sysbuf), 0); + + if (free_it) { + LocalFree(sysbuf); + } + + return ret; +#endif +} +/* }}} */ + /* deprecated */ PHPAPI php_stream *_php_stream_sock_open_from_socket(php_socket_t socket, const char *persistent_id STREAMS_DC TSRMLS_DC) { diff --git a/main/output.c b/main/output.c index 68f3fa11b9..41b2c65cdf 100644 --- a/main/output.c +++ b/main/output.c @@ -55,7 +55,7 @@ static HashTable php_output_handler_reverse_conflicts; static inline int php_output_lock_error(int op TSRMLS_DC); static inline void php_output_op(int op, const char *str, size_t len TSRMLS_DC); -static inline php_output_handler *php_output_handler_init(const char *name, size_t name_len, size_t chunk_size, int flags TSRMLS_DC); +static inline php_output_handler *php_output_handler_init(zend_string *name, size_t chunk_size, int flags TSRMLS_DC); static inline php_output_handler_status_t php_output_handler_op(php_output_handler *handler, php_output_context *context); static inline int php_output_handler_append(php_output_handler *handler, const php_output_buffer *buf TSRMLS_DC); static inline zval *php_output_handler_status(php_output_handler *handler, zval *entry); @@ -508,7 +508,7 @@ PHPAPI php_output_handler *php_output_handler_create_user(zval *output_handler, default: user = ecalloc(1, sizeof(php_output_handler_user_func_t)); if (SUCCESS == zend_fcall_info_init(output_handler, 0, &user->fci, &user->fcc, &handler_name, &error TSRMLS_CC)) { - handler = php_output_handler_init(handler_name->val, handler_name->len, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_USER TSRMLS_CC); + handler = php_output_handler_init(handler_name, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_USER TSRMLS_CC); ZVAL_COPY(&user->zoh, output_handler); handler->func.user = user; } else { @@ -532,9 +532,11 @@ PHPAPI php_output_handler *php_output_handler_create_user(zval *output_handler, PHPAPI php_output_handler *php_output_handler_create_internal(const char *name, size_t name_len, php_output_handler_context_func_t output_handler, size_t chunk_size, int flags TSRMLS_DC) { php_output_handler *handler; + zend_string *str = STR_INIT(name, name_len, 1); - handler = php_output_handler_init(name, name_len, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_INTERNAL TSRMLS_CC); + handler = php_output_handler_init(str, chunk_size, (flags & ~0xf) | PHP_OUTPUT_HANDLER_INTERNAL TSRMLS_CC); handler->func.internal = output_handler; + STR_RELEASE(str); return handler; } @@ -563,17 +565,17 @@ PHPAPI int php_output_handler_start(php_output_handler *handler TSRMLS_DC) if (php_output_lock_error(PHP_OUTPUT_HANDLER_START TSRMLS_CC) || !handler) { return FAILURE; } - if (NULL != (conflict = zend_hash_str_find_ptr(&php_output_handler_conflicts, handler->name, handler->name_len))) { - if (SUCCESS != conflict(handler->name, handler->name_len TSRMLS_CC)) { + if (NULL != (conflict = zend_hash_find_ptr(&php_output_handler_conflicts, handler->name))) { + if (SUCCESS != conflict(handler->name->val, handler->name->len TSRMLS_CC)) { return FAILURE; } } - if (NULL != (rconflicts = zend_hash_str_find_ptr(&php_output_handler_reverse_conflicts, handler->name, handler->name_len))) { + if (NULL != (rconflicts = zend_hash_find_ptr(&php_output_handler_reverse_conflicts, handler->name))) { for (zend_hash_internal_pointer_reset_ex(rconflicts, &pos); (conflict = zend_hash_get_current_data_ptr_ex(rconflicts, &pos)) != NULL; zend_hash_move_forward_ex(rconflicts, &pos) ) { - if (SUCCESS != conflict(handler->name, handler->name_len TSRMLS_CC)) { + if (SUCCESS != conflict(handler->name->val, handler->name->len TSRMLS_CC)) { return FAILURE; } } @@ -596,7 +598,7 @@ PHPAPI int php_output_handler_started(const char *name, size_t name_len TSRMLS_D handlers = (php_output_handler **) zend_stack_base(&OG(handlers)); for (i = 0; i < count; ++i) { - if (name_len == handlers[i]->name_len && !memcmp(handlers[i]->name, name, name_len)) { + if (name_len == handlers[i]->name->len && !memcmp(handlers[i]->name->val, name, name_len)) { return 1; } } @@ -715,10 +717,12 @@ PHPAPI int php_output_handler_hook(php_output_handler_hook_t type, void *arg TSR * Destroy an output handler */ PHPAPI void php_output_handler_dtor(php_output_handler *handler TSRMLS_DC) { -//??? STR_FREE(handler->name); - if (handler->name) efree(handler->name); -//??? STR_FREE(handler->buffer.data); - if (handler->buffer.data) efree(handler->buffer.data); + if (handler->name) { + STR_RELEASE(handler->name); + } + if (handler->buffer.data) { + efree(handler->buffer.data); + } if (handler->flags & PHP_OUTPUT_HANDLER_USER) { zval_ptr_dtor(&handler->func.user->zoh); efree(handler->func.user); @@ -876,13 +880,12 @@ static inline void php_output_context_dtor(php_output_context *context) /* {{{ static php_output_handler *php_output_handler_init(zval *name, size_t chunk_size, int flags TSRMLS_DC) * Allocates and initializes a php_output_handler structure */ -static inline php_output_handler *php_output_handler_init(const char *name, size_t name_len, size_t chunk_size, int flags TSRMLS_DC) +static inline php_output_handler *php_output_handler_init(zend_string *name, size_t chunk_size, int flags TSRMLS_DC) { php_output_handler *handler; handler = ecalloc(1, sizeof(php_output_handler)); - handler->name = estrndup(name, name_len); - handler->name_len = name_len; + handler->name = STR_COPY(name); handler->size = chunk_size; handler->flags = flags; handler->buffer.size = PHP_OUTPUT_HANDLER_INITBUF_SIZE(chunk_size); @@ -1169,7 +1172,7 @@ static int php_output_stack_apply_list(void *h, void *z) php_output_handler *handler = *(php_output_handler **) h; zval *array = (zval *) z; - add_next_index_stringl(array, handler->name, handler->name_len); + add_next_index_str(array, STR_COPY(handler->name)); return 0; } /* }}} */ @@ -1193,7 +1196,7 @@ static inline zval *php_output_handler_status(php_output_handler *handler, zval ZEND_ASSERT(entry != NULL); array_init(entry); - add_assoc_stringl(entry, "name", handler->name, handler->name_len); + add_assoc_str(entry, "name", STR_COPY(handler->name)); add_assoc_long(entry, "type", (long) (handler->flags & 0xf)); add_assoc_long(entry, "flags", (long) handler->flags); add_assoc_long(entry, "level", (long) handler->level); @@ -1219,7 +1222,7 @@ static inline int php_output_stack_pop(int flags TSRMLS_DC) return 0; } else if (!(flags & PHP_OUTPUT_POP_FORCE) && !(orphan->flags & PHP_OUTPUT_HANDLER_REMOVABLE)) { if (!(flags & PHP_OUTPUT_POP_SILENT)) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to %s buffer of %s (%d)", (flags&PHP_OUTPUT_POP_DISCARD)?"discard":"send", orphan->name, orphan->level); + php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to %s buffer of %s (%d)", (flags&PHP_OUTPUT_POP_DISCARD)?"discard":"send", orphan->name->val, orphan->level); } return 0; } else { @@ -1346,7 +1349,7 @@ PHP_FUNCTION(ob_flush) } if (SUCCESS != php_output_flush(TSRMLS_C)) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to flush buffer of %s (%d)", OG(active)->name, OG(active)->level); + php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to flush buffer of %s (%d)", OG(active)->name->val, OG(active)->level); RETURN_FALSE; } RETURN_TRUE; @@ -1367,7 +1370,7 @@ PHP_FUNCTION(ob_clean) } if (SUCCESS != php_output_clean(TSRMLS_C)) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name, OG(active)->level); + php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name->val, OG(active)->level); RETURN_FALSE; } RETURN_TRUE; @@ -1422,7 +1425,7 @@ PHP_FUNCTION(ob_get_flush) } if (SUCCESS != php_output_end(TSRMLS_C)) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name, OG(active)->level); + php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name->val, OG(active)->level); } } /* }}} */ @@ -1445,7 +1448,7 @@ PHP_FUNCTION(ob_get_clean) } if (SUCCESS != php_output_discard(TSRMLS_C)) { - php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name, OG(active)->level); + php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer of %s (%d)", OG(active)->name->val, OG(active)->level); } } /* }}} */ diff --git a/main/php_network.h b/main/php_network.h index 95299e63da..3a0062c437 100644 --- a/main/php_network.h +++ b/main/php_network.h @@ -63,6 +63,7 @@ * Also works sensibly for win32 */ BEGIN_EXTERN_C() PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize); +PHPAPI zend_string *php_socket_error_str(long err); END_EXTERN_C() #ifdef HAVE_NETINET_IN_H @@ -229,11 +230,11 @@ typedef struct { #endif BEGIN_EXTERN_C() -PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC); +PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, zend_string **error_string TSRMLS_DC); PHPAPI void php_network_freeaddresses(struct sockaddr **sal); PHPAPI php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port, - int socktype, int asynchronous, struct timeval *timeout, char **error_string, + int socktype, int asynchronous, struct timeval *timeout, zend_string **error_string, int *error_code, char *bindto, unsigned short bindport, long sockopts TSRMLS_DC); @@ -242,33 +243,33 @@ PHPAPI int php_network_connect_socket(php_socket_t sockfd, socklen_t addrlen, int asynchronous, struct timeval *timeout, - char **error_string, + zend_string **error_string, int *error_code); #define php_connect_nonb(sock, addr, addrlen, timeout) \ php_network_connect_socket((sock), (addr), (addrlen), 0, (timeout), NULL, NULL) PHPAPI php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port, - int socktype, long sockopts, char **error_string, int *error_code + int socktype, long sockopts, zend_string **error_string, int *error_code TSRMLS_DC); PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen, struct timeval *timeout, - char **error_string, + zend_string **error_string, int *error_code TSRMLS_DC); PHPAPI int php_network_get_sock_name(php_socket_t sock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen TSRMLS_DC); PHPAPI int php_network_get_peer_name(php_socket_t sock, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen TSRMLS_DC); @@ -298,7 +299,7 @@ PHPAPI void php_network_populate_name_from_sockaddr( /* input address */ struct sockaddr *sa, socklen_t sl, /* output readable address */ - char **textaddr, long *textaddrlen, + zend_string **textaddr, /* output address */ struct sockaddr **addr, socklen_t *addrlen diff --git a/main/php_output.h b/main/php_output.h index 45af14f6a5..f8b961c7c3 100644 --- a/main/php_output.h +++ b/main/php_output.h @@ -127,8 +127,7 @@ typedef struct _php_output_handler_user_func_t { } php_output_handler_user_func_t; typedef struct _php_output_handler { - char *name; - size_t name_len; + zend_string *name; int flags; int level; size_t size; diff --git a/main/streams/filter.c b/main/streams/filter.c index d2411c928a..a74802eb14 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -60,7 +60,6 @@ PHPAPI int php_stream_filter_register_factory_volatile(const char *filterpattern if (!FG(stream_filters)) { ALLOC_HASHTABLE(FG(stream_filters)); zend_hash_init(FG(stream_filters), zend_hash_num_elements(&stream_filters_hash), NULL, NULL, 1); -//??? zend_hash_copy(FG(stream_filters), &stream_filters_hash, NULL, &tmpfactory, sizeof(php_stream_filter_factory)); zend_hash_copy(FG(stream_filters), &stream_filters_hash, NULL); } diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index dc10eb4e92..a6797ed898 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -50,7 +50,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in int flags, const char *persistent_id, struct timeval *timeout, php_stream_context *context, - char **error_string, + zend_string **error_string, int *error_code STREAMS_DC TSRMLS_DC); @@ -60,7 +60,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in /* Bind the stream to a local address */ PHPAPI int php_stream_xport_bind(php_stream *stream, const char *name, size_t namelen, - char **error_text + zend_string **error_text TSRMLS_DC); /* Connect to a remote address */ @@ -68,28 +68,28 @@ PHPAPI int php_stream_xport_connect(php_stream *stream, const char *name, size_t namelen, int asynchronous, struct timeval *timeout, - char **error_text, + zend_string **error_text, int *error_code TSRMLS_DC); /* Prepare to listen */ PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, - char **error_text + zend_string **error_text TSRMLS_DC); /* Get the next client and their address as a string, or the underlying address * structure. You must efree either of these if you request them */ PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client, - char **textaddr, int *textaddrlen, + zend_string **textaddr, void **addr, socklen_t *addrlen, struct timeval *timeout, - char **error_text + zend_string **error_text TSRMLS_DC); /* Get the name of either the socket or it's peer */ PHPAPI int php_stream_xport_get_name(php_stream *stream, int want_peer, - char **textaddr, int *textaddrlen, + zend_string **textaddr, void **addr, socklen_t *addrlen TSRMLS_DC); @@ -102,7 +102,7 @@ enum php_stream_xport_send_recv_flags { * peeking, optionally retrieving OOB data */ PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t buflen, long flags, void **addr, socklen_t *addrlen, - char **textaddr, int *textaddrlen TSRMLS_DC); + zend_string **textaddr TSRMLS_DC); /* Similar to send() system call; send data to the stream, optionally * sending it as OOB data */ @@ -155,10 +155,8 @@ typedef struct _php_stream_xport_param { int returncode; struct sockaddr *addr; socklen_t addrlen; - char *textaddr; - long textaddrlen; - - char *error_text; + zend_string *textaddr; + zend_string *error_text; int error_code; } outputs; } php_stream_xport_param; diff --git a/main/streams/transports.c b/main/streams/transports.c index 0db04cd495..7792e24fef 100644 --- a/main/streams/transports.c +++ b/main/streams/transports.c @@ -40,20 +40,20 @@ PHPAPI int php_stream_xport_unregister(const char *protocol TSRMLS_DC) } #define ERR_REPORT(out_err, fmt, arg) \ - if (out_err) { spprintf(out_err, 0, fmt, arg); } \ + if (out_err) { *out_err = strpprintf(0, fmt, arg); } \ else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, arg); } #define ERR_RETURN(out_err, local_err, fmt) \ if (out_err) { *out_err = local_err; } \ - else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, local_err ? local_err : "Unspecified error"); \ - if (local_err) { efree(local_err); local_err = NULL; } \ + else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, local_err ? local_err->val : "Unspecified error"); \ + if (local_err) { STR_RELEASE(local_err); local_err = NULL; } \ } PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options, int flags, const char *persistent_id, struct timeval *timeout, php_stream_context *context, - char **error_string, + zend_string **error_string, int *error_code STREAMS_DC TSRMLS_DC) { @@ -61,7 +61,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in php_stream_transport_factory factory = NULL; const char *p, *protocol = NULL; int n = 0, failed = 0; - char *error_text = NULL; + zend_string *error_text = NULL; struct timeval default_timeout = { 0, 0 }; default_timeout.tv_sec = FG(default_socket_timeout); @@ -195,7 +195,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, in /* Bind the stream to a local address */ PHPAPI int php_stream_xport_bind(php_stream *stream, const char *name, size_t namelen, - char **error_text + zend_string **error_text TSRMLS_DC) { php_stream_xport_param param; @@ -225,7 +225,7 @@ PHPAPI int php_stream_xport_connect(php_stream *stream, const char *name, size_t namelen, int asynchronous, struct timeval *timeout, - char **error_text, + zend_string **error_text, int *error_code TSRMLS_DC) { @@ -257,7 +257,7 @@ PHPAPI int php_stream_xport_connect(php_stream *stream, } /* Prepare to listen */ -PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, char **error_text TSRMLS_DC) +PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, zend_string **error_text TSRMLS_DC) { php_stream_xport_param param; int ret; @@ -282,10 +282,10 @@ PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, char **error /* Get the next client and their address (as a string) */ PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client, - char **textaddr, int *textaddrlen, + zend_string **textaddr, void **addr, socklen_t *addrlen, struct timeval *timeout, - char **error_text + zend_string **error_text TSRMLS_DC) { php_stream_xport_param param; @@ -309,7 +309,6 @@ PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client, } if (textaddr) { *textaddr = param.outputs.textaddr; - *textaddrlen = param.outputs.textaddrlen; } if (error_text) { *error_text = param.outputs.error_text; @@ -321,7 +320,7 @@ PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client, } PHPAPI int php_stream_xport_get_name(php_stream *stream, int want_peer, - char **textaddr, int *textaddrlen, + zend_string **textaddr, void **addr, socklen_t *addrlen TSRMLS_DC) { @@ -343,7 +342,6 @@ PHPAPI int php_stream_xport_get_name(php_stream *stream, int want_peer, } if (textaddr) { *textaddr = param.outputs.textaddr; - *textaddrlen = param.outputs.textaddrlen; } return param.outputs.returncode; @@ -395,7 +393,7 @@ PHPAPI int php_stream_xport_crypto_enable(php_stream *stream, int activate TSRML /* Similar to recv() system call; read data from the stream, optionally * peeking, optionally retrieving OOB data */ PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t buflen, - long flags, void **addr, socklen_t *addrlen, char **textaddr, int *textaddrlen + long flags, void **addr, socklen_t *addrlen, zend_string **textaddr TSRMLS_DC) { php_stream_xport_param param; @@ -455,7 +453,6 @@ PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t bufle } if (textaddr) { *textaddr = param.outputs.textaddr; - *textaddrlen = param.outputs.textaddrlen; } return recvd_len + param.outputs.returncode; } diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index eb0e1cd298..dad78beb13 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -247,7 +247,7 @@ static inline int sock_sendto(php_netstream_data_t *sock, const char *buf, size_ } static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t buflen, int flags, - char **textaddr, long *textaddrlen, + zend_string **textaddr, struct sockaddr **addr, socklen_t *addrlen TSRMLS_DC) { @@ -260,7 +260,7 @@ static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t bu ret = recvfrom(sock->socket, buf, buflen, flags, (struct sockaddr*)&sa, &sl); ret = (ret == SOCK_CONN_ERR) ? -1 : ret; php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, - textaddr, textaddrlen, addr, addrlen TSRMLS_CC); + textaddr, addr, addrlen TSRMLS_CC); } else { ret = recv(sock->socket, buf, buflen, flags); ret = (ret == SOCK_CONN_ERR) ? -1 : ret; @@ -338,7 +338,6 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void case STREAM_XPORT_OP_GET_NAME: xparam->outputs.returncode = php_network_get_sock_name(sock->socket, xparam->want_textaddr ? &xparam->outputs.textaddr : NULL, - xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL, xparam->want_addr ? &xparam->outputs.addr : NULL, xparam->want_addr ? &xparam->outputs.addrlen : NULL TSRMLS_CC); @@ -347,7 +346,6 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void case STREAM_XPORT_OP_GET_PEER_NAME: xparam->outputs.returncode = php_network_get_peer_name(sock->socket, xparam->want_textaddr ? &xparam->outputs.textaddr : NULL, - xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL, xparam->want_addr ? &xparam->outputs.addr : NULL, xparam->want_addr ? &xparam->outputs.addrlen : NULL TSRMLS_CC); @@ -383,7 +381,6 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void xparam->inputs.buf, xparam->inputs.buflen, flags, xparam->want_textaddr ? &xparam->outputs.textaddr : NULL, - xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL, xparam->want_addr ? &xparam->outputs.addr : NULL, xparam->want_addr ? &xparam->outputs.addrlen : NULL TSRMLS_CC); @@ -533,7 +530,7 @@ static inline int parse_unix_address(php_stream_xport_param *xparam, struct sock } #endif -static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, char **err TSRMLS_DC) +static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, zend_string **err TSRMLS_DC) { char *colon; char *host = NULL; @@ -546,7 +543,7 @@ static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *po p = memchr(str + 1, ']', str_len - 2); if (!p || *(p + 1) != ':') { if (get_err) { - spprintf(err, 0, "Failed to parse IPv6 address \"%s\"", str); + *err = strpprintf(0, "Failed to parse IPv6 address \"%s\"", str); } return NULL; } @@ -564,7 +561,7 @@ static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *po host = estrndup(str, colon - str); } else { if (get_err) { - spprintf(err, 0, "Failed to parse address \"%s\"", str); + *err = strpprintf(0, "Failed to parse address \"%s\"", str); } return NULL; } @@ -593,7 +590,7 @@ static inline int php_tcp_sockop_bind(php_stream *stream, php_netstream_data_t * if (sock->socket == SOCK_ERR) { if (xparam->want_errortext) { - spprintf(&xparam->outputs.error_text, 0, "Failed to create unix%s socket %s", + xparam->outputs.error_text = strpprintf(0, "Failed to create unix%s socket %s", stream->ops == &php_stream_unix_socket_ops ? "" : "datagram", strerror(errno)); } @@ -664,7 +661,7 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_ if (sock->socket == SOCK_ERR) { if (xparam->want_errortext) { - spprintf(&xparam->outputs.error_text, 0, "Failed to create unix socket"); + xparam->outputs.error_text = strpprintf(0, "Failed to create unix socket"); } return -1; } @@ -692,7 +689,7 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_ if (PHP_STREAM_CONTEXT(stream) && (tmpzval = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "socket", "bindto")) != NULL) { if (Z_TYPE_P(tmpzval) != IS_STRING) { if (xparam->want_errortext) { - spprintf(&xparam->outputs.error_text, 0, "local_addr context option is not a string."); + xparam->outputs.error_text = strpprintf(0, "local_addr context option is not a string."); } efree(host); return -1; @@ -756,7 +753,6 @@ static inline int php_tcp_sockop_accept(php_stream *stream, php_netstream_data_t clisock = php_network_accept_incoming(sock->socket, xparam->want_textaddr ? &xparam->outputs.textaddr : NULL, - xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL, xparam->want_addr ? &xparam->outputs.addr : NULL, xparam->want_addr ? &xparam->outputs.addrlen : NULL, xparam->inputs.timeout, diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 16f11fd40c..ff3889dd6c 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -238,7 +238,6 @@ static void print_modules(TSRMLS_D) HashTable sorted_registry; zend_hash_init(&sorted_registry, 64, NULL, NULL, 1); -//??? zend_hash_copy(&sorted_registry, &module_registry, NULL, &tmp, sizeof(zend_module_entry)); zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, zend_qsort, module_name_cmp, 0 TSRMLS_CC); zend_hash_apply(&sorted_registry, print_module_info TSRMLS_CC); diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 8fe195f6d7..09cfd02ec9 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -415,7 +415,7 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */ HashTable *headers; zend_string *key; char *value; - HashPosition pos; + zval tmp; if (zend_parse_parameters_none() == FAILURE) { return; @@ -426,13 +426,10 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */ array_init_size(return_value, zend_hash_num_elements(headers)); - zend_hash_internal_pointer_reset_ex(headers, &pos); - while ((value = zend_hash_get_current_data_ptr_ex(headers, &pos)) != NULL) { - zend_hash_get_current_key_ex(headers, &key, NULL, 0, &pos); -//??? - add_assoc_string_ex(return_value, key->val, key->len, value); - zend_hash_move_forward_ex(headers, &pos); - } + ZEND_HASH_FOREACH_STR_KEY_PTR(headers, key, value) { + ZVAL_STRING(&tmp, value); + zend_symtable_update(Z_ARRVAL_P(return_value), key, &tmp); + } ZEND_HASH_FOREACH_END(); } /* }}} */ @@ -1210,7 +1207,7 @@ static void php_cli_server_logf(const char *format TSRMLS_DC, ...) /* {{{ */ efree(buf); } /* }}} */ -static int php_network_listen_socket(const char *host, int *port, int socktype, int *af, socklen_t *socklen, char **errstr TSRMLS_DC) /* {{{ */ +static int php_network_listen_socket(const char *host, int *port, int socktype, int *af, socklen_t *socklen, zend_string **errstr TSRMLS_DC) /* {{{ */ { int retval = SOCK_ERR; int err = 0; @@ -1325,7 +1322,7 @@ out: closesocket(retval); } if (errstr) { - *errstr = php_socket_strerror(err, NULL, 0); + *errstr = php_socket_error_str(err); } return SOCK_ERR; } @@ -1795,12 +1792,12 @@ static int php_cli_server_client_ctor(php_cli_server_client *client, php_cli_ser client->addr = addr; client->addr_len = addr_len; { - char *addr_str = 0; - long addr_str_len = 0; - php_network_populate_name_from_sockaddr(addr, addr_len, &addr_str, &addr_str_len, NULL, 0 TSRMLS_CC); - client->addr_str = pestrndup(addr_str, addr_str_len, 1); - client->addr_str_len = addr_str_len; - efree(addr_str); + zend_string *addr_str = 0; + + php_network_populate_name_from_sockaddr(addr, addr_len, &addr_str, NULL, 0 TSRMLS_CC); + client->addr_str = pestrndup(addr_str->val, addr_str->len, 1); + client->addr_str_len = addr_str->len; + STR_RELEASE(addr_str); } php_http_parser_init(&client->parser, PHP_HTTP_REQUEST); client->request_read = 0; @@ -2187,7 +2184,7 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c { int retval = SUCCESS; char *host = NULL; - char *errstr = NULL; + zend_string *errstr = NULL; char *_document_root = NULL; char *_router = NULL; int err = 0; @@ -2234,8 +2231,10 @@ static int php_cli_server_ctor(php_cli_server *server, const char *addr, const c server_sock = php_network_listen_socket(host, &port, SOCK_STREAM, &server->address_family, &server->socklen, &errstr TSRMLS_CC); if (server_sock == SOCK_ERR) { - php_cli_server_logf("Failed to listen on %s:%d (reason: %s)" TSRMLS_CC, host, port, errstr ? errstr: "?"); - efree(errstr); + php_cli_server_logf("Failed to listen on %s:%d (reason: %s)" TSRMLS_CC, host, port, errstr ? errstr->val : "?"); + if (errstr) { + STR_RELEASE(errstr); + } retval = FAILURE; goto out; } diff --git a/win32/sendmail.c b/win32/sendmail.c index ed9736c1dd..c191e0f3aa 100644 --- a/win32/sendmail.c +++ b/win32/sendmail.c @@ -616,9 +616,6 @@ static int SendText(char *RPath, char *Subject, char *mailTo, char *mailCc, char return (res); } -//???PHPAPI zend_string *php_str_to_str(char *haystack, int length, char *needle, -//??? int needle_len, char *str, int str_len); - /* Escape \n. sequences * We use php_str_to_str() and not php_str_replace_in_subject(), since the latter * uses ZVAL as it's parameters */ |