]> granicus.if.org Git - php/commitdiff
Refacting smart_str
authorXinchen Hui <laruence@gmail.com>
Tue, 18 Feb 2014 09:42:46 +0000 (17:42 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 18 Feb 2014 09:42:46 +0000 (17:42 +0800)
21 files changed:
Zend/zend_API.h
ext/date/php_date.c
ext/date/php_date.h
ext/pcre/php_pcre.c
ext/spl/spl_array.c
ext/spl/spl_dllist.c
ext/spl/spl_iterators.c
ext/spl/spl_observer.c
ext/standard/file.c
ext/standard/filters.c
ext/standard/http.c
ext/standard/http_fopen_wrapper.c
ext/standard/php_smart_str.h
ext/standard/php_smart_str_public.h
ext/standard/string.c
ext/standard/url_scanner_ex.c
ext/standard/url_scanner_ex.re
ext/standard/var.c
main/php_variables.c
main/spprintf.c
sapi/cli/php_cli_server.c

index 2db0c2d44e8cd9ac35a06c8b775ec5f065d8cd21..7f8f30d8f29b6c76f70a461b6ae9a9bd8556ff30 100644 (file)
@@ -554,7 +554,7 @@ END_EXTERN_C()
        } while (0)
 
 #define ZVAL_EMPTY_STRING(z) do {                              \
-               ZVAL_STRINGL(z, "", 0);                                 \
+               ZVAL_STR(z, STR_EMPTY_ALLOC());                 \
        } while (0)
 
 #define ZVAL_PSTRINGL(z, s, l) do {                            \
index 105d0ad6d4f976802e66892b2ff962b58b51305f..19895ee7e62bdd0315b129b69a120740f2d198a5 100644 (file)
@@ -1046,7 +1046,7 @@ char *php_date_short_day_name(timelib_sll y, timelib_sll m, timelib_sll d)
 /* }}} */
 
 /* {{{ date_format - (gm)date helper */
-static char *date_format(char *format, int format_len, timelib_time *t, int localtime)
+static zend_string *date_format(char *format, int format_len, timelib_time *t, int localtime)
 {
        smart_str            string = {0};
        int                  i, length = 0;
@@ -1057,7 +1057,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca
        int                  weekYearSet = 0;
 
        if (!format_len) {
-               return estrdup("");
+               return STR_EMPTY_ALLOC();
        }
 
        if (localtime) {
@@ -1201,7 +1201,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca
                timelib_time_offset_dtor(offset);
        }
 
-       return string.c;
+       return string.s;
 }
 
 static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime)
@@ -1209,7 +1209,6 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime)
        char   *format;
        int     format_len;
        long    ts;
-       char   *string;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, &ts) == FAILURE) {
                RETURN_FALSE;
@@ -1218,18 +1217,15 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime)
                ts = time(NULL);
        }
 
-       string = php_format_date(format, format_len, ts, localtime TSRMLS_CC);
-       
-//???  RETVAL_STRING(string, 0);
-       RETVAL_STRING(string);
+       RETURN_STR(php_format_date(format, format_len, ts, localtime TSRMLS_CC));
 }
 /* }}} */
 
-PHPAPI char *php_format_date(char *format, int format_len, time_t ts, int localtime TSRMLS_DC) /* {{{ */
+PHPAPI zend_string *php_format_date(char *format, int format_len, time_t ts, int localtime TSRMLS_DC) /* {{{ */
 {
        timelib_time   *t;
        timelib_tzinfo *tzi;
-       char *string;
+       zend_string *string;
 
        t = timelib_time_ctor();
 
@@ -2204,8 +2200,7 @@ static HashTable *date_object_get_properties(zval *object TSRMLS_DC)
        }
 
        /* first we add the date and time in ISO format */
-//???  ZVAL_STRING(zv, date_format("Y-m-d H:i:s", 12, dateobj->time, 1), 0);
-       ZVAL_STRING(&zv, date_format("Y-m-d H:i:s", 12, dateobj->time, 1));
+       ZVAL_STR(&zv, date_format("Y-m-d H:i:s", 12, dateobj->time, 1));
        zend_hash_str_update(props, "date", sizeof("date")-1, &zv);
 
        /* then we add the timezone name (or similar) */
@@ -2989,8 +2984,7 @@ PHP_FUNCTION(date_format)
        }
        dateobj = (php_date_obj *) Z_OBJ_P(object);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
-//???  RETURN_STRING(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime), 0);
-       RETURN_STRING(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime));
+       RETURN_STR(date_format(format, format_len, dateobj->time, dateobj->time->is_localtime));
 }
 /* }}} */
 
@@ -3846,7 +3840,7 @@ PHP_FUNCTION(timezone_transitions_get)
 #define add_nominal() \
                array_init(&element); \
                add_assoc_long(&element, "ts",     timestamp_begin); \
-               add_assoc_string(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, timestamp_begin, 0 TSRMLS_CC), 0); \
+               add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, timestamp_begin, 0 TSRMLS_CC)); \
                add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \
                add_assoc_bool(&element, "isdst",  tzobj->tzi.tz->type[0].isdst); \
                add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[0].abbr_idx], 1); \
@@ -3855,7 +3849,7 @@ PHP_FUNCTION(timezone_transitions_get)
 #define add(i,ts) \
                array_init(&element); \
                add_assoc_long(&element, "ts",     ts); \
-               add_assoc_string(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, ts, 0 TSRMLS_CC), 0); \
+               add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601, 13, ts, 0 TSRMLS_CC)); \
                add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \
                add_assoc_bool(&element, "isdst",  tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].isdst); \
                add_assoc_string(&element, "abbr", &tzobj->tzi.tz->timezone_abbr[tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].abbr_idx], 1); \
@@ -4278,7 +4272,7 @@ static char *date_interval_format(char *format, int format_len, timelib_rel_time
 
        smart_str_0(&string);
 
-       return string.c;
+       return string.s;
 }
 /* }}} */
 
index d4204ebd79b7a6c256b4a1d5997feface8ad589d..4ebccf60e5ff7215d2dd92c725d71ccefb1f6b02 100644 (file)
@@ -190,7 +190,7 @@ PHPAPI int php_idate(char format, time_t ts, int localtime TSRMLS_DC);
 #define _php_strftime php_strftime
 PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gm);
 #endif
-PHPAPI char *php_format_date(char *format, int format_len, time_t ts, int localtime TSRMLS_DC);
+PHPAPI zend_string *php_format_date(char *format, int format_len, time_t ts, int localtime TSRMLS_DC);
 
 /* Mechanism to set new TZ database */
 PHPAPI void php_date_set_tzdb(timelib_tzdb *tzdb);
index a8976eeede27824e212093cf287fef5952c48644..473a189ce6156d243443965aa7cd800fce0477ea 100644 (file)
@@ -906,7 +906,7 @@ static int preg_do_eval(char *eval_str, int eval_str_len, char *subject,
                if ('\\' == *walk || '$' == *walk) {
                        smart_str_appendl(&code, segment, walk - segment);
                        if (walk_last == '\\') {
-                               code.c[code.len-1] = *walk++;
+                               code.s->val[code.s->len-1] = *walk++;
                                segment = walk;
                                walk_last = 0;
                                continue;
@@ -946,9 +946,9 @@ static int preg_do_eval(char *eval_str, int eval_str_len, char *subject,
 
        compiled_string_description = zend_make_compiled_string_description("regexp code" TSRMLS_CC);
        /* Run the code */
-       if (zend_eval_stringl(code.c, code.len, &retval, compiled_string_description TSRMLS_CC) == FAILURE) {
+       if (zend_eval_stringl(code.s->val, code.s->len, &retval, compiled_string_description TSRMLS_CC) == FAILURE) {
                efree(compiled_string_description);
-               php_error_docref(NULL TSRMLS_CC,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, code.c);
+               php_error_docref(NULL TSRMLS_CC,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, code.s->val);
                /* zend_error() does not return in this case */
        }
        efree(compiled_string_description);
index ec28e2e4fdcc5e8f465158e741998dd295dd87bf..e272a145e52a93cc762e5a1c1837a6a8549d1578 100644 (file)
@@ -717,7 +717,7 @@ void spl_array_iterator_append(zval *object, zval *append_value TSRMLS_DC) /* {{
        }
 
        if (Z_TYPE(intern->array) == IS_OBJECT) {
-               php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Cannot append properties to objects, use %s::offsetSet() instead", Z_OBJCE_P(object)->name);
+               php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Cannot append properties to objects, use %s::offsetSet() instead", Z_OBJCE_P(object)->name->val);
                return;
        }
 
@@ -759,11 +759,11 @@ SPL_METHOD(Array, offsetUnset)
    Return a copy of the contained array */
 SPL_METHOD(Array, getArrayCopy)
 {
-       zval *object = getThis(), *tmp;
+       zval *object = getThis();
        spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
 
     array_init(return_value);
-       zend_hash_copy(HASH_OF(return_value), spl_array_get_hash_table(intern, 0 TSRMLS_CC), (copy_ctor_func_t) zval_add_ref);
+       zend_hash_copy(Z_ARRVAL_P(return_value), spl_array_get_hash_table(intern, 0 TSRMLS_CC), (copy_ctor_func_t) zval_add_ref);
 } /* }}} */
 
 static HashTable *spl_array_get_properties(zval *object TSRMLS_DC) /* {{{ */
@@ -1683,10 +1683,8 @@ SPL_METHOD(Array, serialize)
        /* done */
        PHP_VAR_SERIALIZE_DESTROY(var_hash);
 
-       if (buf.c) {
-               RETVAL_STRINGL(buf.c, buf.len);
-               smart_str_free(&buf);
-               return;
+       if (buf.s) {
+               RETVAL_STR(buf.s);
        }
 
        zval_ptr_dtor(&members);
index 35fa40a7c1c7ff92dc704f24add30f428a2c8cc0..fbe249456e01b6bc1516107a81f784fdc1462c52 100644 (file)
@@ -317,7 +317,7 @@ static void spl_ptr_llist_shift(spl_ptr_llist *llist, zval *ret TSRMLS_DC) /* {{
 
 static void spl_ptr_llist_copy(spl_ptr_llist *from, spl_ptr_llist *to TSRMLS_DC) /* {{{ */
 {
-       spl_ptr_llist_element   *current = from->head, *next;
+       spl_ptr_llist_element *current = from->head, *next;
        spl_ptr_llist_ctor_func  ctor    = from->ctor;
 
        while (current) {
@@ -1145,10 +1145,8 @@ SPL_METHOD(SplDoublyLinkedList, serialize)
        /* done */
        PHP_VAR_SERIALIZE_DESTROY(var_hash);
 
-       if (buf.c) {
-               RETVAL_STRINGL(buf.c, buf.len);
-               smart_str_free(&buf);
-               return;
+       if (buf.s) {
+               RETURN_STR(buf.s);
        } else {
                RETURN_NULL();
        }
index 719344ad06413934a12749c9097f99db86f441f9..81d1ecc4bc984452d92e5bd41ed437991c831c22 100644 (file)
@@ -972,15 +972,15 @@ static void spl_recursive_tree_iterator_get_prefix(spl_recursive_it_object *obje
        zval       has_next;
        int        level;
 
-       smart_str_appendl(&str, object->prefix[0].c, object->prefix[0].len);
+       smart_str_appendl(&str, object->prefix[0].s->val, object->prefix[0].s->len);
        
        for (level = 0; level < object->level; ++level) {
                zend_call_method_with_0_params(&object->iterators[level].zobject, object->iterators[level].ce, NULL, "hasnext", &has_next);
                if (Z_TYPE(has_next) != IS_UNDEF) {
                        if (Z_LVAL(has_next)) {
-                               smart_str_appendl(&str, object->prefix[1].c, object->prefix[1].len);
+                               smart_str_appendl(&str, object->prefix[1].s->val, object->prefix[1].s->len);
                        } else {
-                               smart_str_appendl(&str, object->prefix[2].c, object->prefix[2].len);
+                               smart_str_appendl(&str, object->prefix[2].s->val, object->prefix[2].s->len);
                        }
                        zval_ptr_dtor(&has_next);
                }
@@ -988,21 +988,20 @@ static void spl_recursive_tree_iterator_get_prefix(spl_recursive_it_object *obje
        zend_call_method_with_0_params(&object->iterators[level].zobject, object->iterators[level].ce, NULL, "hasnext", &has_next);
        if (Z_TYPE(has_next) != IS_UNDEF) {
                if (Z_LVAL(has_next)) {
-                       smart_str_appendl(&str, object->prefix[3].c, object->prefix[3].len);
+                       smart_str_appendl(&str, object->prefix[3].s->val, object->prefix[3].s->len);
                } else {
-                       smart_str_appendl(&str, object->prefix[4].c, object->prefix[4].len);
+                       smart_str_appendl(&str, object->prefix[4].s->val, object->prefix[4].s->len);
                }
                zval_ptr_dtor(&has_next);
        }
 
-       smart_str_appendl(&str, object->prefix[5].c, object->prefix[5].len);
+       smart_str_appendl(&str, object->prefix[5].s->val, object->prefix[5].s->len);
        smart_str_0(&str);
 
-       RETVAL_STRINGL(str.c, str.len);
-       smart_str_free(&str);
+       RETURN_STR(str.s);
 }
 
-static void spl_recursive_tree_iterator_get_entry(spl_recursive_it_object * object, zval * return_value TSRMLS_DC)
+static void spl_recursive_tree_iterator_get_entry(spl_recursive_it_object *object, zval *return_value TSRMLS_DC)
 {
        zend_object_iterator      *iterator = object->iterators[object->level].iterator;
        zval                      *data;
@@ -1023,9 +1022,10 @@ static void spl_recursive_tree_iterator_get_entry(spl_recursive_it_object * obje
        zend_restore_error_handling(&error_handling TSRMLS_CC);
 }
 
-static void spl_recursive_tree_iterator_get_postfix(spl_recursive_it_object * object, zval * return_value TSRMLS_DC)
+static void spl_recursive_tree_iterator_get_postfix(spl_recursive_it_object *object, zval *return_value TSRMLS_DC)
 {
-       RETVAL_STRINGL(object->postfix[0].c, object->postfix[0].len);
+       RETVAL_STR(object->postfix[0].s);
+       Z_ADDREF_P(return_value);
 }
 
 /* {{{ proto void RecursiveTreeIterator::__construct(RecursiveIterator|IteratorAggregate it [, int flags = RTIT_BYPASS_KEY [, int cit_flags = CIT_CATCH_GET_CHILD [, mode = RIT_SELF_FIRST ]]]) throws InvalidArgumentException
index c91379bf208bbb408e4a0718b31e3345bf84e3a3..411fed6812251013cc8a658634a7e197a775ee2e 100644 (file)
@@ -284,7 +284,6 @@ static zend_object *spl_object_storage_clone(zval *zobject TSRMLS_DC)
 {
        zend_object *old_object;
        zend_object *new_object;
-       spl_SplObjectStorage *intern;
 
        old_object = Z_OBJ_P(zobject);
        new_object = spl_object_storage_new_ex(old_object->ce, zobject TSRMLS_CC);
@@ -763,10 +762,8 @@ SPL_METHOD(SplObjectStorage, serialize)
        /* done */
        PHP_VAR_SERIALIZE_DESTROY(var_hash);
 
-       if (buf.c) {
-               RETVAL_STRINGL(buf.c, buf.len);
-               smart_str_free(&buf);
-               return;
+       if (buf.s) {
+               RETURN_STR(buf.s);
        } else {
                RETURN_NULL();
        }
index 5cb33932bf0d1a5e2347258354af906facefc165..d471fa6899b389a369cfa096dfc6586f55727c50 100644 (file)
@@ -1934,7 +1934,7 @@ PHPAPI int php_fputcsv(php_stream *stream, zval *fields, char delimiter, char en
        smart_str_appendc(&csvline, '\n');
        smart_str_0(&csvline);
 
-       ret = php_stream_write(stream, csvline.c, csvline.len);
+       ret = php_stream_write(stream, csvline.s->val, csvline.s->len);
 
        smart_str_free(&csvline);
 
index 64cff0ed71b04817d69f61fac9007ad703c3deab..e99bd8d299f5c768802f626ca2a2b9fb6a0be0e1 100644 (file)
@@ -247,7 +247,7 @@ static php_stream_filter_ops strfilter_strip_tags_ops = {
 static php_stream_filter *strfilter_strip_tags_create(const char *filtername, zval *filterparams, int persistent TSRMLS_DC)
 {
        php_strip_tags_filter *inst;
-       smart_str tags_ss = { 0, 0, 0 };
+       smart_str tags_ss = {0};
        
        inst = pemalloc(sizeof(php_strip_tags_filter), persistent);
 
@@ -273,24 +273,17 @@ static php_stream_filter *strfilter_strip_tags_create(const char *filtername, zv
                } else {
                        /* FIXME: convert_to_* may clutter zvals and lead it into segfault ? */
                        convert_to_string_ex(filterparams);
-
-                       tags_ss.c = Z_STRVAL_P(filterparams);
-                       tags_ss.len = Z_STRLEN_P(filterparams);
-                       tags_ss.a = 0;
+                       smart_str_setl(&tags_ss, Z_STRVAL_P(filterparams), Z_STRLEN_P(filterparams));
                }
        }
 
-       if (php_strip_tags_filter_ctor(inst, tags_ss.c, tags_ss.len, persistent) != SUCCESS) {
-               if (tags_ss.a != 0) {
-//???                  STR_FREE(tags_ss.c);
-               }
+       if (php_strip_tags_filter_ctor(inst, tags_ss.s->val, tags_ss.s->len, persistent) != SUCCESS) {
+               smart_str_free(&tags_ss);
                pefree(inst, persistent);
                return NULL;
        }
 
-       if (tags_ss.a != 0) {
-//???          STR_FREE(tags_ss.c);
-       }
+       smart_str_free(&tags_ss);
 
        return php_stream_filter_alloc(&strfilter_strip_tags_ops, inst, persistent);
 }
index 4d6762dc12164fd4749e89109db5928388990caf..5fe9112076be194e330edb66e1ea80d28b7f644d 100644 (file)
@@ -141,7 +141,7 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                        /* Skip these types */
                        continue;
                } else {
-                       if (formstr->len) {
+                       if (formstr->s->len) {
                                smart_str_appendl(formstr, arg_sep, arg_sep_len);
                        }
                        /* Simple key=value */
@@ -220,20 +220,19 @@ PHP_FUNCTION(http_build_query)
        }
 
        if (php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL), arg_sep, enc_type TSRMLS_CC) == FAILURE) {
-               if (formstr.c) {
-                       efree(formstr.c);
+               if (formstr.s) {
+                       smart_str_free(&formstr);
                }
                RETURN_FALSE;
        }
 
-       if (!formstr.c) {
+       if (!formstr.s) {
                RETURN_EMPTY_STRING();
        }
 
        smart_str_0(&formstr);
        
-//???  RETURN_STRINGL(formstr.c, formstr.len, 0);
-       RETURN_STRINGL(formstr.c, formstr.len);
+       RETURN_STR(formstr.s);
 }
 /* }}} */
 
index 84fc2a72aeb76dd8f58146410e7ce74be4109cd0..db87e6907cb4c3644e2b1c6d4a89f145a76d78d5 100644 (file)
@@ -294,7 +294,7 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 finish:
                smart_str_appendl(&header, "\r\n", sizeof("\r\n")-1);
 
-               if (php_stream_write(stream, header.c, header.len) != header.len) {
+               if (php_stream_write(stream, header.s->val, header.s->len) != header.s->len) {
                        php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Cannot connect to HTTPS server through proxy");
                        php_stream_close(stream);
                        stream = NULL;
@@ -438,8 +438,8 @@ finish:
                        }
                        smart_str_0(&tmpstr);
                        /* Remove newlines and spaces from start and end. there's at least one extra \r\n at the end that needs to go. */
-                       if (tmpstr.c) {
-                               tmp = php_trim(tmpstr.c, strlen(tmpstr.c), NULL, 0, NULL, 3 TSRMLS_CC);
+                       if (tmpstr.s) {
+                               tmp = php_trim(tmpstr.s->val, tmpstr.s->len, NULL, 0, NULL, 3 TSRMLS_CC);
                                smart_str_free(&tmpstr);
                        }
                }
index d59258f0910282abe70cd2eb849796ee1fe4e302..e11eb734ed7ac944778f993e66f5afebdd6ebe76 100644 (file)
@@ -29,8 +29,8 @@
 #endif
 
 #define smart_str_0(x) do {                                                                                    \
-       if ((x)->c) {                                                                                                   \
-               (x)->c[(x)->len] = '\0';                                                                        \
+       if ((x)->s) {                                                                                                   \
+               (x)->s->val[(x)->s->len] = '\0';                                                        \
        }                                                                                                                               \
 } while (0)
 
 #define SMART_STR_START_SIZE 78
 #endif
 
+
 #ifdef SMART_STR_USE_REALLOC
-#define SMART_STR_REALLOC(a,b,c) realloc((a),(b))
+#define SMART_STR_DO_REALLOC(b, w) do {                                                                \
+       (b)->s = erealloc((buf)->s, sizeof(zend_string) + (b)->a);              \
+} while (0)
 #else
-#define SMART_STR_REALLOC(a,b,c) perealloc((a),(b),(c))
+#define SMART_STR_DO_REALLOC(b, w) do {                                                                \
+       (b)->s = perealloc((b)->s, sizeof(zend_string) + (b)->a, (w));  \
+} while (0)
 #endif
 
-#define SMART_STR_DO_REALLOC(d, what) \
-       (d)->c = SMART_STR_REALLOC((d)->c, (d)->a + 1, (what))
 
 #define smart_str_alloc4(d, n, what, newlen) do {                                      \
-       if (!(d)->c) {                                                                                                  \
-               (d)->len = 0;                                                                                           \
+       if (!(d)->s) {                                                                                                  \
                newlen = (n);                                                                                           \
                (d)->a = newlen < SMART_STR_START_SIZE                                          \
                                ? SMART_STR_START_SIZE                                                          \
                                : newlen + SMART_STR_PREALLOC;                                          \
-               SMART_STR_DO_REALLOC(d, what);                                                          \
+               (d)->s = STR_ALLOC((d)->a, (what));                                                     \
+               (d)->s->len = 0;                                                                                        \
        } else {                                                                                                                \
-               newlen = (d)->len + (n);                                                                        \
+               newlen = (d)->s->len + (n);                                                                     \
                if (newlen >= (d)->a) {                                                                         \
                        (d)->a = newlen + SMART_STR_PREALLOC;                                   \
-                       SMART_STR_DO_REALLOC(d, what);                                                  \
+                       SMART_STR_DO_REALLOC((d), (what));                                              \
                }                                                                                                                       \
        }                                                                                                                               \
 } while (0)
 #define smart_str_append_unsigned(dest, val) \
        smart_str_append_unsigned_ex((dest), (val), 0)
 
-#define smart_str_appendc_ex(dest, ch, what) do {                                      \
-       register size_t __nl;                                                                                   \
-       smart_str_alloc4((dest), 1, (what), __nl);                                              \
-       (dest)->len = __nl;                                                                                             \
-       ((unsigned char *) (dest)->c)[(dest)->len - 1] = (ch);                  \
+#define smart_str_appendc_ex(dest, ch, what) do {                                 \
+       register size_t __nl;                                                                              \
+       smart_str_alloc4((dest), 1, (what), __nl);                                         \
+       (dest)->s->len = __nl;                                                                             \
+       ((unsigned char *) (dest)->s->val)[(dest)->s->len - 1] = (ch); \
 } while (0)
 
-#define smart_str_free_ex(s, what) do {                                                                \
-       smart_str *__s = (smart_str *) (s);                                                             \
-       if (__s->c) {                                                                                                   \
-               pefree(__s->c, what);                                                                           \
-               __s->c = NULL;                                                                                          \
+#define smart_str_free_ex(buf, what) do {                                                      \
+       smart_str *__s = (smart_str *) (buf);                                                   \
+       if (__s->s) {                                                                                                   \
+               STR_RELEASE(__s->s);                                                                            \
+               __s->s = NULL;                                                                                          \
        }                                                                                                                               \
-       __s->a = __s->len = 0;                                                                                  \
+       __s->a = 0;                                                                                                             \
 } while (0)
 
 #define smart_str_appendl_ex(dest, src, nlen, what) do {                       \
        smart_str *__dest = (smart_str *) (dest);                                               \
                                                                                                                                        \
        smart_str_alloc4(__dest, (nlen), (what), __nl);                                 \
-       memcpy(__dest->c + __dest->len, (src), (nlen));                                 \
-       __dest->len = __nl;                                                                                             \
+       memcpy(__dest->s->val + __dest->s->len, (src), (nlen));                 \
+       __dest->s->len = __nl;                                                                                  \
 } while (0)
 
 /* input: buf points to the END of the buffer */
 } while (0)
 
 /* buf points to the END of the buffer */
-#define smart_str_print_long4(buf, num, vartype, result) do {  \
+#define smart_str_print_long4(buf, num, vartype, result) do {          \
        if (num < 0) {                                                                                                  \
                /* this might cause problems when dealing with LONG_MIN         \
                   and machines which don't support long long.  Works           \
                   flawlessly on 32bit x86 */                                                           \
-               smart_str_print_unsigned4((buf), -(num), vartype, (result));    \
+               smart_str_print_unsigned4((buf), -(num), vartype, (result));\
                *--(result) = '-';                                                                                      \
        } else {                                                                                                                \
                smart_str_print_unsigned4((buf), (num), vartype, (result));     \
@@ -178,15 +181,13 @@ static inline char *smart_str_print_unsigned(char *buf, long num) {
 #define smart_str_append_off_t_ex(dest, num, type) \
        smart_str_append_generic_ex((dest), (num), (type), off_t, _long)
 
-#define smart_str_append_ex(dest, src, what) \
-       smart_str_appendl_ex((dest), ((smart_str *)(src))->c, \
-               ((smart_str *)(src))->len, (what));
+#define smart_str_append_ex(dest, src, what)                                           \
+       smart_str_appendl_ex((dest), ((smart_str *)(src))->s->val,              \
+               ((smart_str *)(src))->s->len, (what));
 
 
 #define smart_str_setl(dest, src, nlen) do {                                           \
-       (dest)->len = (nlen);                                                                                   \
-       (dest)->a = (nlen) + 1;                                                                                 \
-       (dest)->c = (char *) (src);                                                                             \
+       smart_str_appendl_ex((dest), (src), (nlen), 0);                                 \
 } while (0)
 
 #define smart_str_sets(dest, src) \
index b445dd7767836247321b25218212d4893d32322c..7ce299e442b222cf0d50f1bb7997ac2bc3d32cb0 100644 (file)
@@ -24,8 +24,7 @@
 #include <sys/types.h>
 
 typedef struct {
-       char *c;
-       size_t len;
+       zend_string *s;
        size_t a;
 } smart_str;
 
index 76815def26fb59c4e0a7466c74fe763bb60f24d5..5fff869bce083210b1717d15787dba47dbe205df 100644 (file)
@@ -1201,9 +1201,8 @@ PHPAPI void php_implode(zval *delim, zval *arr, zval *return_value TSRMLS_DC)
        }
        smart_str_0(&implstr);
 
-       if (implstr.len) {
-//???          RETURN_STRINGL(implstr.c, implstr.len, 0);
-               RETURN_STRINGL(implstr.c, implstr.len);
+       if (implstr.s) {
+               RETURN_STR(implstr.s);
        } else {
                smart_str_free(&implstr);
                RETURN_EMPTY_STRING();
@@ -3069,10 +3068,9 @@ end_outer_loop: ;
 
        smart_str_appendl(&result, &S(text)[nextwpos], L(text) - nextwpos);
 
-       if (result.c != NULL) {
+       if (result.s) {
                smart_str_0(&result);
-//???          RETVAL_STRINGL(result.c, result.len, 0);
-               RETVAL_STRINGL(result.c, result.len);
+               RETURN_STR(result.s);
        } else {
                RETURN_EMPTY_STRING();
        }
index 08ccd0207fc1907b181884d2d0ab32f8c1ed8c23..d71c97a28d9fa562caaff96e58d1f33efd3c3980 100644 (file)
@@ -115,7 +115,7 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
        const char *bash = NULL;
        const char *sep = "?";
        
-       q = (p = url->c) + url->len;
+       q = (p = url->s->val) + url->s->len;
 
 scan:
 
@@ -194,13 +194,13 @@ yy8:
 done:
        
        /* Don't modify URLs of the format "#mark" */
-       if (bash && bash - url->c == 0) {
+       if (bash && bash - url->s->val == 0) {
                smart_str_append(dest, url);
                return;
        }
 
        if (bash)
-               smart_str_appendl(dest, url->c, bash - url->c);
+               smart_str_appendl(dest, url->s->val, bash - url->s->val);
        else
                smart_str_append(dest, url);
 
@@ -222,7 +222,7 @@ static inline void tag_arg(url_adapt_state_ex_t *ctx, char quotes, char type TSR
 {
        char f = 0;
 
-       if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
+       if (strncasecmp(ctx->arg.s->val, ctx->lookup_data, ctx->arg.s->len) == 0)
                f = 1;
 
        if (quotes)
@@ -276,18 +276,18 @@ static void handle_form(STD_PARA)
 {
        int doit = 0;
 
-       if (ctx->form_app.len > 0) {
-               switch (ctx->tag.len) {
+       if (ctx->form_app.s->len > 0) {
+               switch (ctx->tag.s->len) {
                        case sizeof("form") - 1:
-                               if (!strncasecmp(ctx->tag.c, "form", sizeof("form") - 1)) {
+                               if (!strncasecmp(ctx->tag.s->val, "form", sizeof("form") - 1)) {
                                        doit = 1;               
                                }
-                               if (doit && ctx->val.c && ctx->lookup_data && *ctx->lookup_data) {
-                                       char *e, *p = zend_memnstr(ctx->val.c, "://", sizeof("://") - 1, ctx->val.c + ctx->val.len);
+                               if (doit && ctx->val.s->val && ctx->lookup_data && *ctx->lookup_data) {
+                                       char *e, *p = (char *)zend_memnstr(ctx->val.s->val, "://", sizeof("://") - 1, ctx->val.s->val + ctx->val.s->len);
                                        if (p) {
-                                               e = memchr(p, '/', (ctx->val.c + ctx->val.len) - p);
+                                               e = memchr(p, '/', (ctx->val.s->val + ctx->val.s->len) - p);
                                                if (!e) {
-                                                       e = ctx->val.c + ctx->val.len;
+                                                       e = ctx->val.s->val + ctx->val.s->len;
                                                }
                                                if ((e - p) && strncasecmp(p, ctx->lookup_data, (e - p))) {
                                                        doit = 0;
@@ -297,7 +297,7 @@ static void handle_form(STD_PARA)
                                break;
 
                        case sizeof("fieldset") - 1:
-                               if (!strncasecmp(ctx->tag.c, "fieldset", sizeof("fieldset") - 1)) {
+                               if (!strncasecmp(ctx->tag.s->val, "fieldset", sizeof("fieldset") - 1)) {
                                        doit = 1;               
                                }
                                break;
@@ -320,18 +320,19 @@ static inline void handle_tag(STD_PARA)
        int ok = 0;
        unsigned int i;
 
-       ctx->tag.len = 0;
+       ctx->tag.s->len = 0;
        smart_str_appendl(&ctx->tag, start, YYCURSOR - start);
-       for (i = 0; i < ctx->tag.len; i++)
-               ctx->tag.c[i] = tolower((int)(unsigned char)ctx->tag.c[i]);
-       if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.c, ctx->tag.len)) != NULL)
+       for (i = 0; i < ctx->tag.s->len; i++)
+               ctx->tag.s->val[i] = tolower((int)(unsigned char)ctx->tag.s->val[i]);
+    /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */
+       if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.s->val, ctx->tag.s->len)) != NULL)
                ok = 1;
        STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN;
 }
 
 static inline void handle_arg(STD_PARA) 
 {
-       ctx->arg.len = 0;
+       ctx->arg.s->len = 0;
        smart_str_appendl(&ctx->arg, start, YYCURSOR - start);
 }
 
@@ -350,8 +351,8 @@ static inline void xx_mainloop(url_adapt_state_ex_t *ctx, const char *newdata, s
 
        smart_str_appendl(&ctx->buf, newdata, newlen);
        
-       YYCURSOR = ctx->buf.c;
-       YYLIMIT = ctx->buf.c + ctx->buf.len;
+       YYCURSOR = ctx->buf.s->val;
+       YYLIMIT = ctx->buf.s->val + ctx->buf.s->len;
 
        switch (STATE) {
                case STATE_PLAIN: goto state_plain;
@@ -369,7 +370,7 @@ state_plain_begin:
 state_plain:
        start = YYCURSOR;
 
-#line 373 "ext/standard/url_scanner_ex.c"
+#line 374 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -412,9 +413,9 @@ state_plain:
                goto yy15;
        }
        ++YYCURSOR;
-#line 308 "ext/standard/url_scanner_ex.re"
+#line 309 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); STATE = STATE_TAG; goto state_tag; }
-#line 418 "ext/standard/url_scanner_ex.c"
+#line 419 "ext/standard/url_scanner_ex.c"
 yy15:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -422,17 +423,17 @@ yy15:
        if (yybm[0+yych] & 128) {
                goto yy15;
        }
-#line 309 "ext/standard/url_scanner_ex.re"
+#line 310 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); goto state_plain; }
-#line 428 "ext/standard/url_scanner_ex.c"
+#line 429 "ext/standard/url_scanner_ex.c"
 }
-#line 310 "ext/standard/url_scanner_ex.re"
+#line 311 "ext/standard/url_scanner_ex.re"
 
 
 state_tag:     
        start = YYCURSOR;
 
-#line 436 "ext/standard/url_scanner_ex.c"
+#line 437 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -483,14 +484,14 @@ yy20:
        yych = *YYCURSOR;
        goto yy25;
 yy21:
-#line 315 "ext/standard/url_scanner_ex.re"
+#line 316 "ext/standard/url_scanner_ex.re"
        { handle_tag(STD_ARGS); /* Sets STATE */; passthru(STD_ARGS); if (STATE == STATE_PLAIN) goto state_plain; else goto state_next_arg; }
-#line 489 "ext/standard/url_scanner_ex.c"
+#line 490 "ext/standard/url_scanner_ex.c"
 yy22:
        ++YYCURSOR;
-#line 316 "ext/standard/url_scanner_ex.re"
+#line 317 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); goto state_plain_begin; }
-#line 494 "ext/standard/url_scanner_ex.c"
+#line 495 "ext/standard/url_scanner_ex.c"
 yy24:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -501,7 +502,7 @@ yy25:
        }
        goto yy21;
 }
-#line 317 "ext/standard/url_scanner_ex.re"
+#line 318 "ext/standard/url_scanner_ex.re"
 
 
 state_next_arg_begin:
@@ -510,7 +511,7 @@ state_next_arg_begin:
 state_next_arg:
        start = YYCURSOR;
 
-#line 514 "ext/standard/url_scanner_ex.c"
+#line 515 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -575,28 +576,28 @@ yy28:
        ++YYCURSOR;
        if ((yych = *YYCURSOR) == '>') goto yy39;
 yy29:
-#line 328 "ext/standard/url_scanner_ex.re"
+#line 329 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); goto state_plain_begin; }
-#line 581 "ext/standard/url_scanner_ex.c"
+#line 582 "ext/standard/url_scanner_ex.c"
 yy30:
        ++YYCURSOR;
 yy31:
-#line 325 "ext/standard/url_scanner_ex.re"
+#line 326 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); handle_form(STD_ARGS); goto state_plain_begin; }
-#line 587 "ext/standard/url_scanner_ex.c"
+#line 588 "ext/standard/url_scanner_ex.c"
 yy32:
        ++YYCURSOR;
        yych = *YYCURSOR;
        goto yy38;
 yy33:
-#line 326 "ext/standard/url_scanner_ex.re"
+#line 327 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); goto state_next_arg; }
-#line 595 "ext/standard/url_scanner_ex.c"
+#line 596 "ext/standard/url_scanner_ex.c"
 yy34:
        ++YYCURSOR;
-#line 327 "ext/standard/url_scanner_ex.re"
+#line 328 "ext/standard/url_scanner_ex.re"
        { --YYCURSOR; STATE = STATE_ARG; goto state_arg; }
-#line 600 "ext/standard/url_scanner_ex.c"
+#line 601 "ext/standard/url_scanner_ex.c"
 yy36:
        yych = *++YYCURSOR;
        goto yy29;
@@ -614,13 +615,13 @@ yy39:
        yych = *YYCURSOR;
        goto yy31;
 }
-#line 329 "ext/standard/url_scanner_ex.re"
+#line 330 "ext/standard/url_scanner_ex.re"
 
 
 state_arg:
        start = YYCURSOR;
 
-#line 624 "ext/standard/url_scanner_ex.c"
+#line 625 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -668,14 +669,14 @@ yy42:
        yych = *YYCURSOR;
        goto yy47;
 yy43:
-#line 334 "ext/standard/url_scanner_ex.re"
+#line 335 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); handle_arg(STD_ARGS); STATE = STATE_BEFORE_VAL; goto state_before_val; }
-#line 674 "ext/standard/url_scanner_ex.c"
+#line 675 "ext/standard/url_scanner_ex.c"
 yy44:
        ++YYCURSOR;
-#line 335 "ext/standard/url_scanner_ex.re"
+#line 336 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); STATE = STATE_NEXT_ARG; goto state_next_arg; }
-#line 679 "ext/standard/url_scanner_ex.c"
+#line 680 "ext/standard/url_scanner_ex.c"
 yy46:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -686,13 +687,13 @@ yy47:
        }
        goto yy43;
 }
-#line 336 "ext/standard/url_scanner_ex.re"
+#line 337 "ext/standard/url_scanner_ex.re"
 
 
 state_before_val:
        start = YYCURSOR;
 
-#line 696 "ext/standard/url_scanner_ex.c"
+#line 697 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -739,17 +740,17 @@ yy50:
        if (yych == ' ') goto yy57;
        if (yych == '=') goto yy55;
 yy51:
-#line 342 "ext/standard/url_scanner_ex.re"
+#line 343 "ext/standard/url_scanner_ex.re"
        { --YYCURSOR; goto state_next_arg_begin; }
-#line 745 "ext/standard/url_scanner_ex.c"
+#line 746 "ext/standard/url_scanner_ex.c"
 yy52:
        ++YYCURSOR;
        yych = *YYCURSOR;
        goto yy56;
 yy53:
-#line 341 "ext/standard/url_scanner_ex.re"
+#line 342 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); STATE = STATE_VAL; goto state_val; }
-#line 753 "ext/standard/url_scanner_ex.c"
+#line 754 "ext/standard/url_scanner_ex.c"
 yy54:
        yych = *++YYCURSOR;
        goto yy51;
@@ -771,14 +772,14 @@ yy57:
        YYCURSOR = YYMARKER;
        goto yy51;
 }
-#line 343 "ext/standard/url_scanner_ex.re"
+#line 344 "ext/standard/url_scanner_ex.re"
 
 
 
 state_val:
        start = YYCURSOR;
 
-#line 782 "ext/standard/url_scanner_ex.c"
+#line 783 "ext/standard/url_scanner_ex.c"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -839,9 +840,9 @@ state_val:
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych != '>') goto yy76;
 yy63:
-#line 352 "ext/standard/url_scanner_ex.re"
+#line 353 "ext/standard/url_scanner_ex.re"
        { passthru(STD_ARGS); goto state_next_arg_begin; }
-#line 845 "ext/standard/url_scanner_ex.c"
+#line 846 "ext/standard/url_scanner_ex.c"
 yy64:
        yych = *(YYMARKER = ++YYCURSOR);
        if (yych == '>') goto yy63;
@@ -851,9 +852,9 @@ yy65:
        yych = *YYCURSOR;
        goto yy69;
 yy66:
-#line 351 "ext/standard/url_scanner_ex.re"
+#line 352 "ext/standard/url_scanner_ex.re"
        { handle_val(STD_ARGS, 0, ' '); goto state_next_arg_begin; }
-#line 857 "ext/standard/url_scanner_ex.c"
+#line 858 "ext/standard/url_scanner_ex.c"
 yy67:
        yych = *++YYCURSOR;
        goto yy63;
@@ -880,9 +881,9 @@ yy72:
        goto yy63;
 yy73:
        ++YYCURSOR;
-#line 350 "ext/standard/url_scanner_ex.re"
+#line 351 "ext/standard/url_scanner_ex.re"
        { handle_val(STD_ARGS, 1, '\''); goto state_next_arg_begin; }
-#line 886 "ext/standard/url_scanner_ex.c"
+#line 887 "ext/standard/url_scanner_ex.c"
 yy75:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -893,11 +894,11 @@ yy76:
        }
        if (yych >= '>') goto yy72;
        ++YYCURSOR;
-#line 349 "ext/standard/url_scanner_ex.re"
+#line 350 "ext/standard/url_scanner_ex.re"
        { handle_val(STD_ARGS, 1, '"'); goto state_next_arg_begin; }
-#line 899 "ext/standard/url_scanner_ex.c"
+#line 900 "ext/standard/url_scanner_ex.c"
 }
-#line 353 "ext/standard/url_scanner_ex.re"
+#line 354 "ext/standard/url_scanner_ex.re"
 
 
 stop:
@@ -906,12 +907,13 @@ stop:
        /* XXX: Crash avoidance. Need to work with reporter to figure out what goes wrong */    
        if (rest < 0) rest = 0;
        
-       if (rest) memmove(ctx->buf.c, start, rest);
-       ctx->buf.len = rest;
+       if (rest) memmove(ctx->buf.s->val, start, rest);
+       ctx->buf.s->len = rest;
 }
 
 char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC)
 {
+       char *result;
        smart_str surl = {0};
        smart_str buf = {0};
        smart_str url_app = {0};
@@ -925,11 +927,13 @@ char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const cha
        append_modified_url(&surl, &buf, &url_app, PG(arg_separator).output);
 
        smart_str_0(&buf);
-       if (newlen) *newlen = buf.len;
+       if (newlen) *newlen = buf.s->len;
+       result = estrndup(buf.s->val, buf.s->len);
 
        smart_str_free(&url_app);
+       smart_str_free(&buf);
 
-       return buf.c;
+       return result;
 }
 
 
@@ -942,19 +946,18 @@ static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, zend_
 
        xx_mainloop(ctx, src, srclen TSRMLS_CC);
 
-       *newlen = ctx->result.len;
-       if (!ctx->result.c) {
+       *newlen = ctx->result.s->len;
+       if (!ctx->result.s) {
                smart_str_appendl(&ctx->result, "", 0);
        }
        smart_str_0(&ctx->result);
        if (do_flush) {
-               smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
-               *newlen += ctx->buf.len;
+               smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
+               *newlen += ctx->buf.s->len;
                smart_str_free(&ctx->buf);
        }
-       retval = ctx->result.c;
-       ctx->result.c = NULL;
-       ctx->result.len = 0;
+       retval = estrndup(ctx->result.s->val, ctx->result.s->len);
+       smart_str_free(&ctx->result);
        return retval;
 }
 
@@ -987,25 +990,24 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
 {
        size_t len;
 
-       if (BG(url_adapt_state_ex).url_app.len != 0) {
+       if (BG(url_adapt_state_ex).url_app.s->len != 0) {
                *handled_output = url_adapt_ext(output, output_len, &len, (zend_bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0) TSRMLS_CC);
                if (sizeof(uint) < sizeof(size_t)) {
                        if (len > UINT_MAX)
                                len = UINT_MAX;
                }
                *handled_output_len = len;
-       } else if (BG(url_adapt_state_ex).url_app.len == 0) {
+       } else if (BG(url_adapt_state_ex).url_app.s->len == 0) {
                url_adapt_state_ex_t *ctx = &BG(url_adapt_state_ex);
-               if (ctx->buf.len) {
-                       smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
+               if (ctx->buf.s) {
+                       smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
                        smart_str_appendl(&ctx->result, output, output_len);
 
-                       *handled_output = ctx->result.c;
-                       *handled_output_len = ctx->buf.len + output_len;
+                       *handled_output = estrndup(ctx->result.s->val, ctx->result.s->len);
+                       *handled_output_len = ctx->buf.s->len + output_len;
 
-                       ctx->result.c = NULL;
-                       ctx->result.len = 0;
                        smart_str_free(&ctx->buf);
+                       smart_str_free(&ctx->result);
                } else {
                        *handled_output = estrndup(output, *handled_output_len = output_len);
                }
@@ -1027,7 +1029,7 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        }
 
 
-       if (BG(url_adapt_state_ex).url_app.len != 0) {
+       if (BG(url_adapt_state_ex).url_app.s->len != 0) {
                smart_str_appends(&BG(url_adapt_state_ex).url_app, PG(arg_separator).output);
        }
 
@@ -1056,8 +1058,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
 
 PHPAPI int php_url_scanner_reset_vars(TSRMLS_D)
 {
-       BG(url_adapt_state_ex).form_app.len = 0;
-       BG(url_adapt_state_ex).url_app.len = 0;
+       BG(url_adapt_state_ex).form_app.s->len = 0;
+       BG(url_adapt_state_ex).url_app.s->len = 0;
 
        return SUCCESS;
 }
@@ -1066,8 +1068,7 @@ PHP_MINIT_FUNCTION(url_scanner)
 {
        BG(url_adapt_state_ex).tags = NULL;
 
-       BG(url_adapt_state_ex).form_app.c = BG(url_adapt_state_ex).url_app.c = 0;
-       BG(url_adapt_state_ex).form_app.len = BG(url_adapt_state_ex).url_app.len = 0;
+       BG(url_adapt_state_ex).form_app.s = BG(url_adapt_state_ex).url_app.s = NULL;
 
        REGISTER_INI_ENTRIES();
        return SUCCESS;
index bfc0252299c6dae12f9173906ef738503863a799..8488e2bb9ec4a165d46686235a922b8615590425 100644 (file)
@@ -118,7 +118,7 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
        const char *bash = NULL;
        const char *sep = "?";
        
-       q = (p = url->c) + url->len;
+       q = (p = url->s->val) + url->s->len;
 
 scan:
 /*!re2c
@@ -130,13 +130,13 @@ scan:
 done:
        
        /* Don't modify URLs of the format "#mark" */
-       if (bash && bash - url->c == 0) {
+       if (bash && bash - url->s->val == 0) {
                smart_str_append(dest, url);
                return;
        }
 
        if (bash)
-               smart_str_appendl(dest, url->c, bash - url->c);
+               smart_str_appendl(dest, url->s->val, bash - url->s->val);
        else
                smart_str_append(dest, url);
 
@@ -158,7 +158,7 @@ static inline void tag_arg(url_adapt_state_ex_t *ctx, char quotes, char type TSR
 {
        char f = 0;
 
-       if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
+       if (strncasecmp(ctx->arg.s->val, ctx->lookup_data, ctx->arg.s->len) == 0)
                f = 1;
 
        if (quotes)
@@ -212,18 +212,18 @@ static void handle_form(STD_PARA)
 {
        int doit = 0;
 
-       if (ctx->form_app.len > 0) {
-               switch (ctx->tag.len) {
+       if (ctx->form_app.s->len > 0) {
+               switch (ctx->tag.s->len) {
                        case sizeof("form") - 1:
-                               if (!strncasecmp(ctx->tag.c, "form", sizeof("form") - 1)) {
+                               if (!strncasecmp(ctx->tag.s->val, "form", sizeof("form") - 1)) {
                                        doit = 1;               
                                }
-                               if (doit && ctx->val.c && ctx->lookup_data && *ctx->lookup_data) {
-                                       char *e, *p = zend_memnstr(ctx->val.c, "://", sizeof("://") - 1, ctx->val.c + ctx->val.len);
+                               if (doit && ctx->val.s->val && ctx->lookup_data && *ctx->lookup_data) {
+                                       char *e, *p = (char *)zend_memnstr(ctx->val.s->val, "://", sizeof("://") - 1, ctx->val.s->val + ctx->val.s->len);
                                        if (p) {
-                                               e = memchr(p, '/', (ctx->val.c + ctx->val.len) - p);
+                                               e = memchr(p, '/', (ctx->val.s->val + ctx->val.s->len) - p);
                                                if (!e) {
-                                                       e = ctx->val.c + ctx->val.len;
+                                                       e = ctx->val.s->val + ctx->val.s->len;
                                                }
                                                if ((e - p) && strncasecmp(p, ctx->lookup_data, (e - p))) {
                                                        doit = 0;
@@ -233,7 +233,7 @@ static void handle_form(STD_PARA)
                                break;
 
                        case sizeof("fieldset") - 1:
-                               if (!strncasecmp(ctx->tag.c, "fieldset", sizeof("fieldset") - 1)) {
+                               if (!strncasecmp(ctx->tag.s->val, "fieldset", sizeof("fieldset") - 1)) {
                                        doit = 1;               
                                }
                                break;
@@ -256,18 +256,19 @@ static inline void handle_tag(STD_PARA)
        int ok = 0;
        unsigned int i;
 
-       ctx->tag.len = 0;
+       ctx->tag.s->len = 0;
        smart_str_appendl(&ctx->tag, start, YYCURSOR - start);
-       for (i = 0; i < ctx->tag.len; i++)
-               ctx->tag.c[i] = tolower((int)(unsigned char)ctx->tag.c[i]);
-       if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.c, ctx->tag.len)) != NULL)
+       for (i = 0; i < ctx->tag.s->len; i++)
+               ctx->tag.s->val[i] = tolower((int)(unsigned char)ctx->tag.s->val[i]);
+    /* intentionally using str_find here, in case the hash value is set, but the string val is changed later */
+       if ((ctx->lookup_data = zend_hash_str_find_ptr(ctx->tags, ctx->tag.s->val, ctx->tag.s->len)) != NULL)
                ok = 1;
        STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN;
 }
 
 static inline void handle_arg(STD_PARA) 
 {
-       ctx->arg.len = 0;
+       ctx->arg.s->len = 0;
        smart_str_appendl(&ctx->arg, start, YYCURSOR - start);
 }
 
@@ -286,8 +287,8 @@ static inline void xx_mainloop(url_adapt_state_ex_t *ctx, const char *newdata, s
 
        smart_str_appendl(&ctx->buf, newdata, newlen);
        
-       YYCURSOR = ctx->buf.c;
-       YYLIMIT = ctx->buf.c + ctx->buf.len;
+       YYCURSOR = ctx->buf.s->val;
+       YYLIMIT = ctx->buf.s->val + ctx->buf.s->len;
 
        switch (STATE) {
                case STATE_PLAIN: goto state_plain;
@@ -358,12 +359,13 @@ stop:
        /* XXX: Crash avoidance. Need to work with reporter to figure out what goes wrong */    
        if (rest < 0) rest = 0;
        
-       if (rest) memmove(ctx->buf.c, start, rest);
-       ctx->buf.len = rest;
+       if (rest) memmove(ctx->buf.s->val, start, rest);
+       ctx->buf.s->len = rest;
 }
 
 char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC)
 {
+       char *result;
        smart_str surl = {0};
        smart_str buf = {0};
        smart_str url_app = {0};
@@ -377,11 +379,13 @@ char *php_url_scanner_adapt_single_url(const char *url, size_t urllen, const cha
        append_modified_url(&surl, &buf, &url_app, PG(arg_separator).output);
 
        smart_str_0(&buf);
-       if (newlen) *newlen = buf.len;
+       if (newlen) *newlen = buf.s->len;
+       result = estrndup(buf.s->val, buf.s->len);
 
        smart_str_free(&url_app);
+       smart_str_free(&buf);
 
-       return buf.c;
+       return result;
 }
 
 
@@ -394,19 +398,18 @@ static char *url_adapt_ext(const char *src, size_t srclen, size_t *newlen, zend_
 
        xx_mainloop(ctx, src, srclen TSRMLS_CC);
 
-       *newlen = ctx->result.len;
-       if (!ctx->result.c) {
+       *newlen = ctx->result.s->len;
+       if (!ctx->result.s) {
                smart_str_appendl(&ctx->result, "", 0);
        }
        smart_str_0(&ctx->result);
        if (do_flush) {
-               smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
-               *newlen += ctx->buf.len;
+               smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
+               *newlen += ctx->buf.s->len;
                smart_str_free(&ctx->buf);
        }
-       retval = ctx->result.c;
-       ctx->result.c = NULL;
-       ctx->result.len = 0;
+       retval = estrndup(ctx->result.s->val, ctx->result.s->len);
+       smart_str_free(&ctx->result);
        return retval;
 }
 
@@ -439,25 +442,24 @@ static void php_url_scanner_output_handler(char *output, uint output_len, char *
 {
        size_t len;
 
-       if (BG(url_adapt_state_ex).url_app.len != 0) {
+       if (BG(url_adapt_state_ex).url_app.s->len != 0) {
                *handled_output = url_adapt_ext(output, output_len, &len, (zend_bool) (mode & (PHP_OUTPUT_HANDLER_END | PHP_OUTPUT_HANDLER_CONT | PHP_OUTPUT_HANDLER_FLUSH | PHP_OUTPUT_HANDLER_FINAL) ? 1 : 0) TSRMLS_CC);
                if (sizeof(uint) < sizeof(size_t)) {
                        if (len > UINT_MAX)
                                len = UINT_MAX;
                }
                *handled_output_len = len;
-       } else if (BG(url_adapt_state_ex).url_app.len == 0) {
+       } else if (BG(url_adapt_state_ex).url_app.s->len == 0) {
                url_adapt_state_ex_t *ctx = &BG(url_adapt_state_ex);
-               if (ctx->buf.len) {
-                       smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len);
+               if (ctx->buf.s) {
+                       smart_str_appendl(&ctx->result, ctx->buf.s->val, ctx->buf.s->len);
                        smart_str_appendl(&ctx->result, output, output_len);
 
-                       *handled_output = ctx->result.c;
-                       *handled_output_len = ctx->buf.len + output_len;
+                       *handled_output = estrndup(ctx->result.s->val, ctx->result.s->len);
+                       *handled_output_len = ctx->buf.s->len + output_len;
 
-                       ctx->result.c = NULL;
-                       ctx->result.len = 0;
                        smart_str_free(&ctx->buf);
+                       smart_str_free(&ctx->result);
                } else {
                        *handled_output = estrndup(output, *handled_output_len = output_len);
                }
@@ -479,7 +481,7 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
        }
 
 
-       if (BG(url_adapt_state_ex).url_app.len != 0) {
+       if (BG(url_adapt_state_ex).url_app.s->len != 0) {
                smart_str_appends(&BG(url_adapt_state_ex).url_app, PG(arg_separator).output);
        }
 
@@ -508,8 +510,8 @@ PHPAPI int php_url_scanner_add_var(char *name, int name_len, char *value, int va
 
 PHPAPI int php_url_scanner_reset_vars(TSRMLS_D)
 {
-       BG(url_adapt_state_ex).form_app.len = 0;
-       BG(url_adapt_state_ex).url_app.len = 0;
+       BG(url_adapt_state_ex).form_app.s->len = 0;
+       BG(url_adapt_state_ex).url_app.s->len = 0;
 
        return SUCCESS;
 }
@@ -518,8 +520,7 @@ PHP_MINIT_FUNCTION(url_scanner)
 {
        BG(url_adapt_state_ex).tags = NULL;
 
-       BG(url_adapt_state_ex).form_app.c = BG(url_adapt_state_ex).url_app.c = 0;
-       BG(url_adapt_state_ex).form_app.len = BG(url_adapt_state_ex).url_app.len = 0;
+       BG(url_adapt_state_ex).form_app.s = BG(url_adapt_state_ex).url_app.s = NULL;
 
        REGISTER_INI_ENTRIES();
        return SUCCESS;
index 6ae7d24c2e57d9f8d22e06238eb70487bcba6cb4..1e2b85c0555ebc3e770ccdb2ccd2da72b50d01ea 100644 (file)
@@ -507,8 +507,8 @@ PHPAPI void php_var_export(zval *struc, int level TSRMLS_DC) /* {{{ */
 {
        smart_str buf = {0};
        php_var_export_ex(struc, level, &buf TSRMLS_CC);
-       smart_str_0 (&buf);
-       PHPWRITE(buf.c, buf.len);
+       smart_str_0(&buf);
+       PHPWRITE(buf.s->val, buf.s->len);
        smart_str_free(&buf);
 }
 /* }}} */
@@ -530,11 +530,11 @@ PHP_FUNCTION(var_export)
        smart_str_0 (&buf);
 
        if (return_output) {
-               RETVAL_STRINGL(buf.c, buf.len);
+               RETURN_STR(buf.s);
        } else {
-               PHPWRITE(buf.c, buf.len);
+               PHPWRITE(buf.s->val, buf.s->len);
+               smart_str_free(&buf);
        }
-       smart_str_free(&buf);
 }
 /* }}} */
 
@@ -924,9 +924,8 @@ PHP_FUNCTION(serialize)
                RETURN_FALSE;
        }
 
-       if (buf.c) {
-//???          RETURN_STRINGL(buf.c, buf.len, 0);
-               RETURN_STRINGL(buf.c, buf.len);
+       if (buf.s) {
+               RETURN_STR(buf.s);
        } else {
                RETURN_NULL();
        }
index 1d57ceda2825bdea34b273c5e634b421d948a51b..d8277d267a211df958641df2eb127f16f12a0565 100644 (file)
@@ -283,8 +283,8 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof
 {
        uint64_t max_vars = PG(max_input_vars);
 
-       vars->ptr = vars->str.c;
-       vars->end = vars->str.c + vars->str.len;
+       vars->ptr = vars->str.s->val;
+       vars->end = vars->str.s->val + vars->str.s->len;
        while (add_post_var(arr, vars, eof TSRMLS_CC)) {
                if (++vars->cnt > max_vars) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING,
@@ -296,7 +296,7 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof
        }
 
        if (!eof) {
-               memmove(vars->str.c, vars->ptr, vars->str.len = vars->end - vars->ptr);
+               memmove(vars->str.s->val, vars->ptr, vars->str.s->len = vars->end - vars->ptr);
        }
        return SUCCESS;
 }
@@ -318,8 +318,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler)
                                smart_str_appendl(&post_data.str, buf, len);
 
                                if (SUCCESS != add_post_vars(arr, &post_data, 0 TSRMLS_CC)) {
-                                       if (post_data.str.c) {
-                                               efree(post_data.str.c);
+                                       if (post_data.str.s) {
+                                               smart_str_free(&post_data.str);
                                        }
                                        return;
                                }
@@ -331,8 +331,8 @@ SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler)
                }
 
                add_post_vars(arr, &post_data, 1 TSRMLS_CC);
-               if (post_data.str.c) {
-                       efree(post_data.str.c);
+               if (post_data.str.s) {
+                       smart_str_free(&post_data.str);
                }
        }
 }
index 5b16d514412fa6175ca287caff12b0f96ea6e9cb..dfee6d9612d22747975c2523b3183fe843d08c0f 100644 (file)
  * Macro that does padding. The padding is done by printing
  * the character ch.
  */
-#define PAD(xbuf, count, ch) do {                                      \
-       if ((count) > 0) {                                      \
-               size_t newlen;                                                          \
-               smart_str_alloc(xbuf, (count), 0);                      \
-               memset(xbuf->c + xbuf->len, ch, (count));       \
-               xbuf->len += (count);                           \
-       }                                                                                               \
+#define PAD(xbuf, count, ch) do {                                                      \
+       if ((count) > 0) {                                                      \
+               size_t newlen;                                                                          \
+               smart_str_alloc(xbuf, (count), 0);                                      \
+               memset(xbuf->s->val + xbuf->s->len, ch, (count));       \
+               xbuf->s->len += (count);                                                        \
+       }                                                                                                               \
 } while (0)
 
 #define NUM(c) (c - '0')
@@ -700,7 +700,7 @@ static void xbuf_format_converter(smart_str *xbuf, const char *fmt, va_list ap)
 
 
                                case 'n':
-                                       *(va_arg(ap, int *)) = xbuf->len;
+                                       *(va_arg(ap, int *)) = xbuf->s->len;
                                        goto skip_output;
 
                                        /*
@@ -795,17 +795,20 @@ skip_output:
 PHPAPI int vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */
 {
        smart_str xbuf = {0};
+       int result;
 
        xbuf_format_converter(&xbuf, format, ap);
 
-       if (max_len && xbuf.len > max_len) {
-               xbuf.len = max_len;
+       if (max_len && xbuf.s->len > max_len) {
+               xbuf.s->len = max_len;
        }
        smart_str_0(&xbuf);
 
-       *pbuf = xbuf.c;
+       *pbuf = estrndup(xbuf.s->val, xbuf.s->len);
+       result = xbuf.s->len;
+       smart_str_free(&xbuf);
 
-       return xbuf.len;
+       return result;
 }
 /* }}} */
 
index 35d06329d7b0b26d90ec7ab83081df92caaaf5c0..f0160b495c55a219f3613c351f0aeefe5a5b732d 100644 (file)
@@ -669,7 +669,7 @@ static int sapi_cli_server_send_headers(sapi_headers_struct *sapi_headers TSRMLS
        }
        smart_str_appendl(&buffer, "\r\n", 2);
 
-       php_cli_server_client_send_through(client, buffer.c, buffer.len);
+       php_cli_server_client_send_through(client, buffer.s->val, buffer.s->len);
 
        smart_str_free(&buffer);
        return SAPI_HEADER_SENT_SUCCESSFULLY;
@@ -1961,7 +1961,7 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server
                php_cli_server_chunk *chunk;
                smart_str buffer = { 0 };
                append_http_status_line(&buffer, client->request.protocol_version, status, 1);
-               if (!buffer.c) {
+               if (!buffer.s) {
                        /* out of memory */
                        goto fail;
                }
@@ -1972,7 +1972,7 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server
                smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
                smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
 
-               chunk = php_cli_server_chunk_heap_new(buffer.c, buffer.c, buffer.len);
+               chunk = php_cli_server_chunk_heap_new(buffer.s->val, buffer.s->val, buffer.s->len);
                if (!chunk) {
                        smart_str_free_ex(&buffer, 1);
                        goto fail;
@@ -2046,7 +2046,7 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv
                }
 
                append_http_status_line(&buffer, client->request.protocol_version, status, 1);
-               if (!buffer.c) {
+               if (!buffer.s) {
                        /* out of memory */
                        php_cli_server_log_response(client, 500, NULL TSRMLS_CC);
                        return FAILURE;
@@ -2062,7 +2062,7 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv
                smart_str_append_generic_ex(&buffer, client->request.sb.st_size, 1, size_t, _unsigned);
                smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
                smart_str_appendl_ex(&buffer, "\r\n", 2, 1);
-               chunk = php_cli_server_chunk_heap_new(buffer.c, buffer.c, buffer.len);
+               chunk = php_cli_server_chunk_heap_new(buffer.s->val, buffer.s->val, buffer.s->len);
                if (!chunk) {
                        smart_str_free_ex(&buffer, 1);
                        php_cli_server_log_response(client, 500, NULL TSRMLS_CC);