Skip to content

Commit 0f8cf3b

Browse files
nikicsmalyshev
authored andcommitted
Fix bug #73807
1 parent 0e21d80 commit 0f8cf3b

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

main/php_variables.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

242245
static 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

Comments
 (0)