]> granicus.if.org Git - php/commitdiff
Refactor php_url_(en|de)code to return zend_string
authorXinchen Hui <laruence@gmail.com>
Mon, 3 Mar 2014 08:34:43 +0000 (16:34 +0800)
committerXinchen Hui <laruence@gmail.com>
Mon, 3 Mar 2014 08:34:43 +0000 (16:34 +0800)
ext/standard/head.c
ext/standard/http.c
ext/standard/url.c
ext/standard/url.h
ext/standard/url_scanner_ex.c
ext/standard/url_scanner_ex.re

index d63f9376236ea0912d87b3915cb561e31feae309..2fa5e1fdadd9903b330b8aa13c1864c37d352236 100644 (file)
@@ -75,11 +75,12 @@ PHPAPI int php_header(TSRMLS_D)
 
 PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, time_t expires, char *path, int path_len, char *domain, int domain_len, int secure, int url_encode, int httponly TSRMLS_DC)
 {
-       char *cookie, *encoded_value = NULL;
+       char *cookie;
        int len=sizeof("Set-Cookie: ");
        char *dt;
        sapi_header_line ctr = {0};
        int result;
+       zend_string *encoded_value = NULL;
 
        if (name && strpbrk(name, "=,; \t\r\n\013\014") != NULL) {   /* man isspace for \013 and \014 */
                zend_error( E_WARNING, "Cookie names cannot contain any of the following '=,; \\t\\r\\n\\013\\014'" );
@@ -93,14 +94,12 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
 
        len += name_len;
        if (value && url_encode) {
-               int encoded_value_len;
-
-               encoded_value = php_url_encode(value, value_len, &encoded_value_len);
-               len += encoded_value_len;
-       } else if ( value ) {
-               encoded_value = estrdup(value);
-               len += value_len;
+               encoded_value = php_url_encode(value, value_len);
+       } else if (value) {
+               encoded_value = STR_INIT(value, value_len, 0);
        }
+
+       len += encoded_value->len;
        if (path) {
                len += path_len;
        }
@@ -120,7 +119,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
                snprintf(cookie, len + 100, "Set-Cookie: %s=deleted; expires=%s; Max-Age=0", name, dt);
                efree(dt);
        } else {
-               snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value : "");
+               snprintf(cookie, len + 100, "Set-Cookie: %s=%s", name, value ? encoded_value->val : "");
                if (expires > 0) {
                        const char *p;
                        char tsdelta[13];
@@ -131,7 +130,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
                        if (!p || *(p + 5) != ' ') {
                                efree(dt);
                                efree(cookie);
-                               efree(encoded_value);
+                               STR_FREE(encoded_value);
                                zend_error(E_WARNING, "Expiry date cannot have a year greater than 9999");
                                return FAILURE;
                        }
@@ -145,7 +144,7 @@ PHPAPI int php_setcookie(char *name, int name_len, char *value, int value_len, t
        }
 
        if (encoded_value) {
-               efree(encoded_value);
+               STR_FREE(encoded_value);
        }
 
        if (path && path_len > 0) {
index 4263a5f03c6b818ab43defbe014746cc52c1f983..62437f82d69795f02062c6108eca6ed80e8ec686 100644 (file)
@@ -32,8 +32,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                          zval *type, char *arg_sep, int enc_type TSRMLS_DC)
 {
        zend_string *key = NULL;
-       char *ekey, *newprefix, *p, *prop_name;
-       int arg_sep_len, ekey_len, key_type, newprefix_len, prop_len;
+       char *newprefix, *p, *prop_name;
+       int arg_sep_len, key_type, newprefix_len, prop_len;
        ulong idx;
        zval *zdata = NULL, copyzval;
 
@@ -84,12 +84,13 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                }
                if (Z_TYPE_P(zdata) == IS_ARRAY || Z_TYPE_P(zdata) == IS_OBJECT) {
                        if (key_type == HASH_KEY_IS_STRING) {
+                               zend_string *ekey;
                                if (enc_type == PHP_QUERY_RFC3986) {
-                                       ekey = php_raw_url_encode(prop_name, prop_len, &ekey_len);
+                                       ekey = php_raw_url_encode(prop_name, prop_len);
                                } else {
-                                       ekey = php_url_encode(prop_name, prop_len, &ekey_len);
+                                       ekey = php_url_encode(prop_name, prop_len);
                                }
-                               newprefix_len = key_suffix_len + ekey_len + key_prefix_len + 3 /* %5B */;
+                               newprefix_len = key_suffix_len + ekey->len + key_prefix_len + 3 /* %5B */;
                                newprefix = emalloc(newprefix_len + 1);
                                p = newprefix;
 
@@ -98,9 +99,9 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                                        p += key_prefix_len;
                                }
 
-                               memcpy(p, ekey, ekey_len);
-                               p += ekey_len;
-                               efree(ekey);
+                               memcpy(p, ekey->val, ekey->len);
+                               p += ekey->len;
+                               STR_FREE(ekey);
 
                                if (key_suffix) {
                                        memcpy(p, key_suffix, key_suffix_len);
@@ -111,6 +112,8 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                                *(p++) = 'B';
                                *p = '\0';
                        } else {
+                               char *ekey;
+                               int ekey_len;
                                /* Is an integer key */
                                ekey_len = spprintf(&ekey, 0, "%ld", idx);
                                newprefix_len = key_prefix_len + num_prefix_len + ekey_len + key_suffix_len + 3 /* %5B */;
@@ -152,14 +155,17 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                        /* Simple key=value */
                        smart_str_appendl(formstr, key_prefix, key_prefix_len);
                        if (key_type == HASH_KEY_IS_STRING) {
+                               zend_string *ekey;
                                if (enc_type == PHP_QUERY_RFC3986) {
-                                       ekey = php_raw_url_encode(prop_name, prop_len, &ekey_len);
+                                       ekey = php_raw_url_encode(prop_name, prop_len);
                                } else {
-                                       ekey = php_url_encode(prop_name, prop_len, &ekey_len);
+                                       ekey = php_url_encode(prop_name, prop_len);
                                }
-                               smart_str_appendl(formstr, ekey, ekey_len);
-                               efree(ekey);
+                               smart_str_appendl(formstr, ekey->val, ekey->len);
+                               STR_FREE(ekey);
                        } else {
+                               char *ekey;
+                               int ekey_len;
                                /* Numeric key */
                                if (num_prefix) {
                                        smart_str_appendl(formstr, num_prefix, num_prefix_len);
@@ -171,33 +177,52 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                        smart_str_appendl(formstr, key_suffix, key_suffix_len);
                        smart_str_appendl(formstr, "=", 1);
                        switch (Z_TYPE_P(zdata)) {
-                               case IS_STRING:
-                                       if (enc_type == PHP_QUERY_RFC3986) {
-                                               ekey = php_raw_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), &ekey_len);
-                                       } else {
-                                               ekey = php_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), &ekey_len);                                         
+                               case IS_STRING: {
+                                               zend_string *ekey;
+                                               if (enc_type == PHP_QUERY_RFC3986) {
+                                                       ekey = php_raw_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata));
+                                               } else {
+                                                       ekey = php_url_encode(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata));                                            
+                                               }
+                                               smart_str_appendl(formstr, ekey->val, ekey->len);
+                                               STR_FREE(ekey);
                                        }
                                        break;
                                case IS_LONG:
                                case IS_BOOL:
-                                       ekey_len = spprintf(&ekey, 0, "%ld", Z_LVAL_P(zdata));
+                                       {
+                                               char *ekey;
+                                               int ekey_len;
+                                               ekey_len = spprintf(&ekey, 0, "%ld", Z_LVAL_P(zdata));
+                                               smart_str_appendl(formstr, ekey, ekey_len);
+                                               efree(ekey);
+                                       }
                                        break;
                                case IS_DOUBLE:
-                                       ekey_len = spprintf(&ekey, 0, "%.*G", (int) EG(precision), Z_DVAL_P(zdata));
+                                       {
+                                               char *ekey;
+                                               int ekey_len;
+                                               ekey_len = spprintf(&ekey, 0, "%.*G", (int) EG(precision), Z_DVAL_P(zdata));
+                                               smart_str_appendl(formstr, ekey, ekey_len);
+                                               efree(ekey);
+                                       }
                                        break;
                                default:
-                                       /* fall back on convert to string */
-                                       ZVAL_DUP(&copyzval, zdata);
-                                       convert_to_string_ex(&copyzval);
-                                       if (enc_type == PHP_QUERY_RFC3986) {
-                                               ekey = php_raw_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval), &ekey_len);
-                                       } else {
-                                               ekey = php_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval), &ekey_len);
+                                       {
+                                               zend_string *ekey;
+                                               /* fall back on convert to string */
+                                               ZVAL_DUP(&copyzval, zdata);
+                                               convert_to_string_ex(&copyzval);
+                                               if (enc_type == PHP_QUERY_RFC3986) {
+                                                       ekey = php_raw_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval));
+                                               } else {
+                                                       ekey = php_url_encode(Z_STRVAL(copyzval), Z_STRLEN(copyzval));
+                                               }
+                                               smart_str_appendl(formstr, ekey->val, ekey->len);
+                                               zval_ptr_dtor(&copyzval);
+                                               STR_FREE(ekey);
                                        }
-                                       zval_ptr_dtor(&copyzval);
                        }
-                       smart_str_appendl(formstr, ekey, ekey_len);
-                       efree(ekey);
                }
        }
 
index 33b70569aea4e389f4605a64eac94fb391a3b8d6..d280717d8451e1575979800ad9f826667dd94cbd 100644 (file)
@@ -485,15 +485,17 @@ static unsigned char hexchars[] = "0123456789ABCDEF";
 
 /* {{{ php_url_encode
  */
-PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
+PHPAPI zend_string *php_url_encode(char const *s, int len)
 {
        register unsigned char c;
-       unsigned char *to, *start;
+       unsigned char *to;
        unsigned char const *from, *end;
+       zend_string *start;
        
        from = (unsigned char *)s;
        end = (unsigned char *)s + len;
-       start = to = (unsigned char *) safe_emalloc(3, len, 1);
+       start = STR_ALLOC(3 * len, 0);
+       to = (unsigned char*)start->val;
 
        while (from < end) {
                c = *from++;
@@ -521,11 +523,11 @@ PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
                        *to++ = c;
                }
        }
-       *to = 0;
-       if (new_length) {
-               *new_length = to - start;
-       }
-       return (char *) start;
+       *to = '\0';
+
+       start = STR_REALLOC(start, to - (unsigned char*)start->val, 0);
+
+       return start;
 }
 /* }}} */
 
@@ -533,17 +535,13 @@ PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
    URL-encodes string */
 PHP_FUNCTION(urlencode)
 {
-       char *in_str, *out_str;
-       int in_str_len, out_str_len;
+       zend_string *in_str;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
-                                                         &in_str_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
                return;
        }
 
-       out_str = php_url_encode(in_str, in_str_len, &out_str_len);
-//???  RETURN_STRINGL(out_str, out_str_len, 0);
-       RETURN_STRINGL(out_str, out_str_len);
+       RETURN_STR(php_url_encode(in_str->val, in_str->len));
 }
 /* }}} */
 
@@ -551,19 +549,16 @@ PHP_FUNCTION(urlencode)
    Decodes URL-encoded string */
 PHP_FUNCTION(urldecode)
 {
-       char *in_str, *out_str;
-       int in_str_len, out_str_len;
+       zend_string *in_str, *out_str;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
-                                                         &in_str_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
                return;
        }
 
-       out_str = estrndup(in_str, in_str_len);
-       out_str_len = php_url_decode(out_str, in_str_len);
+       out_str = STR_DUP(in_str, 0);
+       out_str->len = php_url_decode(out_str->val, out_str->len);
 
-//???    RETURN_STRINGL(out_str, out_str_len, 0);
-    RETURN_STRINGL(out_str, out_str_len);
+    RETURN_STR(out_str);
 }
 /* }}} */
 
@@ -600,35 +595,34 @@ PHPAPI int php_url_decode(char *str, int len)
 
 /* {{{ php_raw_url_encode
  */
-PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
+PHPAPI zend_string *php_raw_url_encode(char const *s, int len)
 {
        register int x, y;
-       unsigned char *str;
+       zend_string *str;
 
-       str = (unsigned char *) safe_emalloc(3, len, 1);
+       str = STR_ALLOC(3 * len, 0);
        for (x = 0, y = 0; len--; x++, y++) {
-               str[y] = (unsigned char) s[x];
+               str->val[y] = (unsigned char) s[x];
 #ifndef CHARSET_EBCDIC
-               if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
-                       (str[y] < 'A' && str[y] > '9') ||
-                       (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
-                       (str[y] > 'z' && str[y] != '~')) {
-                       str[y++] = '%';
-                       str[y++] = hexchars[(unsigned char) s[x] >> 4];
-                       str[y] = hexchars[(unsigned char) s[x] & 15];
+               if ((str->val[y] < '0' && str->val[y] != '-' && str->val[y] != '.') ||
+                       (str->val[y] < 'A' && str->val[y] > '9') ||
+                       (str->val[y] > 'Z' && str->val[y] < 'a' && str->val[y] != '_') ||
+                       (str->val[y] > 'z' && str->val[y] != '~')) {
+                       str->val[y++] = '%';
+                       str->val[y++] = hexchars[(unsigned char) s[x] >> 4];
+                       str->val[y] = hexchars[(unsigned char) s[x] & 15];
 #else /*CHARSET_EBCDIC*/
-               if (!isalnum(str[y]) && strchr("_-.~", str[y]) != NULL) {
-                       str[y++] = '%';
-                       str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
-                       str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
+               if (!isalnum(str->val[y]) && str->valchr("_-.~", str->val[y]) != NULL) {
+                       str->val[y++] = '%';
+                       str->val[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
+                       str->val[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
 #endif /*CHARSET_EBCDIC*/
                }
        }
-       str[y] = '\0';
-       if (new_length) {
-               *new_length = y;
-       }
-       return ((char *) str);
+       str->val[y] = '\0';
+       str = STR_REALLOC(str, y, 0);
+
+       return str;
 }
 /* }}} */
 
@@ -636,17 +630,13 @@ PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
    URL-encodes string */
 PHP_FUNCTION(rawurlencode)
 {
-       char *in_str, *out_str;
-       int in_str_len, out_str_len;
+       zend_string *in_str;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
-                                                         &in_str_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
                return;
        }
 
-       out_str = php_raw_url_encode(in_str, in_str_len, &out_str_len);
-//???  RETURN_STRINGL(out_str, out_str_len, 0);
-       RETURN_STRINGL(out_str, out_str_len);
+       RETURN_STR(php_raw_url_encode(in_str->val, in_str->len));
 }
 /* }}} */
 
@@ -654,16 +644,13 @@ PHP_FUNCTION(rawurlencode)
    Decodes URL-encodes string */
 PHP_FUNCTION(rawurldecode)
 {
-       char *in_str;
-       int in_str_len;
-       zend_string *out_str;
+       zend_string *in_str, *out_str;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
-                                                         &in_str_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &in_str) == FAILURE) {
                return;
        }
 
-       out_str = STR_INIT(in_str, in_str_len, 0);
+       out_str = STR_DUP(in_str, 0);
        out_str->len = php_raw_url_decode(out_str->val, out_str->len);
 
     RETURN_STR(out_str);
index 89b4b39cf91195d1572f57d5245acfe65d033837..d23f0a1f17c2e5f38d7e79a8c4c1dd847e5fca1a 100644 (file)
@@ -36,8 +36,8 @@ PHPAPI php_url *php_url_parse(char const *str);
 PHPAPI php_url *php_url_parse_ex(char const *str, int length);
 PHPAPI int php_url_decode(char *str, int len); /* return value: length of decoded string */
 PHPAPI int php_raw_url_decode(char *str, int len); /* return value: length of decoded string */
-PHPAPI char *php_url_encode(char const *s, int len, int *new_length);
-PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length);
+PHPAPI zend_string *php_url_encode(char const *s, int len);
+PHPAPI zend_string *php_raw_url_encode(char const *s, int len);
 
 PHP_FUNCTION(parse_url);
 PHP_FUNCTION(urlencode);
index d71c97a28d9fa562caaff96e58d1f33efd3c3980..71ebae0b66cde80c23e9790619c57a4c5362701d 100644 (file)
@@ -1018,9 +1018,8 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
 
 PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int value_len, int urlencode TSRMLS_DC)
 {
-       char *encoded = NULL;
-       int encoded_len;
        smart_str val;
+       zend_string *encoded;
        
        if (! BG(url_adapt_state_ex).active) {
                php_url_scanner_ex_activate(TSRMLS_C);
@@ -1034,8 +1033,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        }
 
        if (urlencode) {
-               encoded = php_url_encode(value, value_len, &encoded_len);
-               smart_str_setl(&val, encoded, encoded_len);
+               encoded = php_url_encode(value, value_len);
+               smart_str_setl(&val, encoded->val, encoded->len);
        } else {
                smart_str_setl(&val, value, value_len);
        }
@@ -1050,8 +1049,9 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        smart_str_append(&BG(url_adapt_state_ex).form_app, &val);
        smart_str_appends(&BG(url_adapt_state_ex).form_app, "\" />");
 
-       if (urlencode)
-               efree(encoded);
+       if (urlencode) {
+               STR_FREE(encoded);
+       }
 
        return SUCCESS;
 }
index 8488e2bb9ec4a165d46686235a922b8615590425..31224f0901ac3e9e00dcd37d8da1fae0799f3cf0 100644 (file)
@@ -470,9 +470,8 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
 
 PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int value_len, int urlencode TSRMLS_DC)
 {
-       char *encoded = NULL;
-       int encoded_len;
        smart_str val;
+       zend_string *encoded;
        
        if (! BG(url_adapt_state_ex).active) {
                php_url_scanner_ex_activate(TSRMLS_C);
@@ -486,8 +485,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        }
 
        if (urlencode) {
-               encoded = php_url_encode(value, value_len, &encoded_len);
-               smart_str_setl(&val, encoded, encoded_len);
+               encoded = php_url_encode(value, value_len);
+               smart_str_setl(&val, encoded->val, encoded->len);
        } else {
                smart_str_setl(&val, value, value_len);
        }
@@ -502,8 +501,9 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        smart_str_append(&BG(url_adapt_state_ex).form_app, &val);
        smart_str_appends(&BG(url_adapt_state_ex).form_app, "\" />");
 
-       if (urlencode)
-               efree(encoded);
+       if (urlencode) {
+               STR_FREE(encoded);
+       }
 
        return SUCCESS;
 }