From: Xinchen Hui Date: Sat, 22 Feb 2014 12:51:26 +0000 (+0800) Subject: Refactor php_addcslashes using zend_string X-Git-Tag: POST_PHPNG_MERGE~412^2~581 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e4cfad1e8f6d199fd396082985aa2a0bb7c716b;p=php Refactor php_addcslashes using zend_string --- diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 2396d40461..197b0950a8 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -121,8 +121,8 @@ PHPAPI struct lconv *localeconv_r(struct lconv *out); PHPAPI char *php_strtoupper(char *s, size_t len); PHPAPI char *php_strtolower(char *s, size_t len); PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen); -PHPAPI char *php_addslashes(char *str, int length, int *new_length, int freeit TSRMLS_DC); -PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int freeit, char *what, int wlength TSRMLS_DC); +PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC); +PHPAPI zend_string *php_addcslashes(const char *str, int length, int freeit, char *what, int wlength TSRMLS_DC); PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC); PHPAPI void php_stripcslashes(char *str, int *len); PHPAPI void php_basename(const char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len TSRMLS_DC); diff --git a/ext/standard/string.c b/ext/standard/string.c index 759839433d..6af765fe2b 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3309,8 +3309,7 @@ PHP_FUNCTION(addcslashes) RETURN_STRINGL(str, str_len); } -//??? Z_STRVAL_P(return_value) = php_addcslashes(str, str_len, &Z_STRLEN_P(return_value), 0, what, what_len TSRMLS_CC); -//??? RETURN_STRINGL(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value), 0); + RETURN_STR(php_addcslashes(str, str_len, 0, what, what_len TSRMLS_CC)); } /* }}} */ @@ -3455,14 +3454,14 @@ PHPAPI void php_stripcslashes(char *str, int *len) /* {{{ php_addcslashes */ -PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int should_free, char *what, int wlength TSRMLS_DC) +PHPAPI zend_string *php_addcslashes(const char *str, int length, int should_free, char *what, int wlength TSRMLS_DC) { char flags[256]; - char *new_str = safe_emalloc(4, (length?length:(length=strlen(str))), 1); char *source, *target; char *end; char c; int newlen; + zend_string *new_str = STR_ALLOC(4 * (length? length : (length = strlen(str))) + 1, 0); if (!wlength) { wlength = strlen(what); @@ -3470,7 +3469,7 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s php_charmask((unsigned char *)what, wlength, flags TSRMLS_CC); - for (source = (char*)str, end = source + length, target = new_str; source < end; source++) { + for (source = (char*)str, end = source + length, target = new_str->val; source < end; source++) { c = *source; if (flags[(unsigned char)c]) { if ((unsigned char) c < 32 || (unsigned char) c > 126) { @@ -3492,12 +3491,9 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s *target++ = c; } *target = 0; - newlen = target - new_str; - if (target - new_str < length * 4) { - new_str = erealloc(new_str, newlen + 1); - } - if (new_length) { - *new_length = newlen; + newlen = target - new_str->val; + if (newlen < length * 4) { + new_str = STR_REALLOC(new_str, newlen, 0); } if (should_free) { //??? STR_FREE((char*)str); diff --git a/ext/standard/var.c b/ext/standard/var.c index e6ea7064c7..1e25551356 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -365,10 +365,10 @@ static int php_array_element_export(zval *zv TSRMLS_DC, int num_args, va_list ar smart_str_appendl(buf, " => ", 4); } else { /* string key */ - char *key, *tmp_str; - int key_len, tmp_len; - key = php_addcslashes(hash_key->key->val, hash_key->key->len, &key_len, 0, "'\\", 2 TSRMLS_CC); - tmp_str = php_str_to_str_ex(key, key_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL); + char *tmp_str; + int tmp_len; + zend_string *key = php_addcslashes(hash_key->key->val, hash_key->key->len, 0, "'\\", 2 TSRMLS_CC); + tmp_str = php_str_to_str_ex(key->val, key->len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL); buffer_append_spaces(buf, level + 1); @@ -376,7 +376,7 @@ static int php_array_element_export(zval *zv TSRMLS_DC, int num_args, va_list ar smart_str_appendl(buf, tmp_str, tmp_len); smart_str_appendl(buf, "' => ", 5); - efree(key); + STR_RELEASE(key); efree(tmp_str); } php_var_export_ex(zv, level + 2, buf TSRMLS_CC); @@ -400,18 +400,16 @@ static int php_object_element_export(zval *zv TSRMLS_DC, int num_args, va_list a if (hash_key->key != NULL) { const char *class_name; /* ignored, but must be passed to unmangle */ const char *pname; - char *pname_esc; - int pname_esc_len; + zend_string *pname_esc; zend_unmangle_property_name(hash_key->key->val, hash_key->key->len, &class_name, &pname); - pname_esc = php_addcslashes(pname, strlen(pname), &pname_esc_len, 0, - "'\\", 2 TSRMLS_CC); + pname_esc = php_addcslashes(pname, strlen(pname), 0, "'\\", 2 TSRMLS_CC); smart_str_appendc(buf, '\''); - smart_str_appendl(buf, pname_esc, pname_esc_len); + smart_str_appendl(buf, pname_esc->val, pname_esc->len); smart_str_appendc(buf, '\''); - efree(pname_esc); + STR_RELEASE(pname_esc); } else { smart_str_append_long(buf, (long) hash_key->h); } @@ -426,9 +424,10 @@ static int php_object_element_export(zval *zv TSRMLS_DC, int num_args, va_list a PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf TSRMLS_DC) /* {{{ */ { HashTable *myht; - char *tmp_str, *tmp_str2; - int tmp_len, tmp_len2; + char *tmp_str; + int tmp_len; zend_string *class_name; + zend_string *ztmp; switch (Z_TYPE_P(struc)) { case IS_BOOL: @@ -450,14 +449,14 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf TSRMLS_DC) efree(tmp_str); break; case IS_STRING: - tmp_str = php_addcslashes(Z_STRVAL_P(struc), Z_STRLEN_P(struc), &tmp_len, 0, "'\\", 2 TSRMLS_CC); - tmp_str2 = php_str_to_str_ex(tmp_str, tmp_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len2, 0, NULL); + ztmp = php_addcslashes(Z_STRVAL_P(struc), Z_STRLEN_P(struc), 0, "'\\", 2 TSRMLS_CC); + tmp_str = php_str_to_str_ex(ztmp->val, ztmp->len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL); smart_str_appendc(buf, '\''); - smart_str_appendl(buf, tmp_str2, tmp_len2); + smart_str_appendl(buf, tmp_str, tmp_len); smart_str_appendc(buf, '\''); - efree(tmp_str2); + STR_RELEASE(ztmp); efree(tmp_str); break; case IS_ARRAY: @@ -682,7 +681,6 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt ce = zend_get_class_entry(struc TSRMLS_CC); if (ce) { zend_string *prot_name, *priv_name; - int prop_name_length; do { priv_name = zend_mangle_property_name(ce->name->val, ce->name->len, Z_STRVAL_P(name), Z_STRLEN_P(name), ce->type & ZEND_INTERNAL_CLASS);