@@ -237,11 +237,14 @@ typedef struct post_var_data {
237
237
char * ptr ;
238
238
char * end ;
239
239
uint64_t cnt ;
240
+
241
+ /* Bytes in ptr that have already been scanned for '&' */
242
+ size_t already_scanned ;
240
243
} post_var_data_t ;
241
244
242
245
static zend_bool add_post_var (zval * arr , post_var_data_t * var , zend_bool eof TSRMLS_DC )
243
246
{
244
- char * ksep , * vsep , * val ;
247
+ char * start , * ksep , * vsep , * val ;
245
248
size_t klen , vlen ;
246
249
/* FIXME: string-size_t */
247
250
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
250
253
return 0 ;
251
254
}
252
255
253
- vsep = memchr (var -> ptr , '&' , var -> end - var -> ptr );
256
+ start = var -> ptr + var -> already_scanned ;
257
+ vsep = memchr (start , '&' , var -> end - start );
254
258
if (!vsep ) {
255
259
if (!eof ) {
260
+ var -> already_scanned = var -> end - var -> ptr ;
256
261
return 0 ;
257
262
} else {
258
263
vsep = var -> end ;
@@ -285,6 +290,7 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSR
285
290
efree (val );
286
291
287
292
var -> ptr = vsep + (vsep != var -> end );
293
+ var -> already_scanned = 0 ;
288
294
return 1 ;
289
295
}
290
296
@@ -304,7 +310,7 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof
304
310
}
305
311
}
306
312
307
- if (!eof ) {
313
+ if (!eof && vars -> str . c != vars -> ptr ) {
308
314
memmove (vars -> str .c , vars -> ptr , vars -> str .len = vars -> end - vars -> ptr );
309
315
}
310
316
return SUCCESS ;
0 commit comments