@@ -237,11 +237,14 @@ typedef struct post_var_data {
237237 char * ptr ;
238238 char * end ;
239239 uint64_t cnt ;
240+
241+ /* Bytes in ptr that have already been scanned for '&' */
242+ size_t already_scanned ;
240243} post_var_data_t ;
241244
242245static zend_bool add_post_var (zval * arr , post_var_data_t * var , zend_bool eof TSRMLS_DC )
243246{
244- char * ksep , * vsep , * val ;
247+ char * start , * ksep , * vsep , * val ;
245248 size_t klen , vlen ;
246249 /* FIXME: string-size_t */
247250 unsigned int new_vlen ;
@@ -250,9 +253,11 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSR
250253 return 0 ;
251254 }
252255
253- vsep = memchr (var -> ptr , '&' , var -> end - var -> ptr );
256+ start = var -> ptr + var -> already_scanned ;
257+ vsep = memchr (start , '&' , var -> end - start );
254258 if (!vsep ) {
255259 if (!eof ) {
260+ var -> already_scanned = var -> end - var -> ptr ;
256261 return 0 ;
257262 } else {
258263 vsep = var -> end ;
@@ -285,6 +290,7 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSR
285290 efree (val );
286291
287292 var -> ptr = vsep + (vsep != var -> end );
293+ var -> already_scanned = 0 ;
288294 return 1 ;
289295}
290296
@@ -304,7 +310,7 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof
304310 }
305311 }
306312
307- if (!eof ) {
313+ if (!eof && vars -> str . c != vars -> ptr ) {
308314 memmove (vars -> str .c , vars -> ptr , vars -> str .len = vars -> end - vars -> ptr );
309315 }
310316 return SUCCESS ;
0 commit comments