Skip to content

Commit a15bffd

Browse files
committed
Fix bug #73807
1 parent 570a273 commit a15bffd

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

Diff for: NEWS

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? 2017 PHP 7.0.17
44

5+
- Core:
6+
. Fixed bug #73807 (Performance problem with processing large post request).
7+
(Nikita)
8+
59
- OpenSSL:
610
. Fixed bug #74022 (PHP Fast CGI crashes when reading from a pfx file).
711
(Anatol)

Diff for: main/php_variables.c

+8-2
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,26 @@ typedef struct post_var_data {
239239
char *ptr;
240240
char *end;
241241
uint64_t cnt;
242+
243+
/* Bytes in ptr that have already been scanned for '&' */
244+
size_t already_scanned;
242245
} post_var_data_t;
243246

244247
static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof)
245248
{
246-
char *ksep, *vsep, *val;
249+
char *start, *ksep, *vsep, *val;
247250
size_t klen, vlen;
248251
size_t new_vlen;
249252

250253
if (var->ptr >= var->end) {
251254
return 0;
252255
}
253256

254-
vsep = memchr(var->ptr, '&', var->end - var->ptr);
257+
start = var->ptr + var->already_scanned;
258+
vsep = memchr(start, '&', var->end - start);
255259
if (!vsep) {
256260
if (!eof) {
261+
var->already_scanned = var->end - var->ptr;
257262
return 0;
258263
} else {
259264
vsep = var->end;
@@ -286,6 +291,7 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof)
286291
efree(val);
287292

288293
var->ptr = vsep + (vsep != var->end);
294+
var->already_scanned = 0;
289295
return 1;
290296
}
291297

0 commit comments

Comments
 (0)