Fix bad pointer arithmetic

The bad arithmetic didn't result in wrong or insecure behavior
(there were no out-of-bound accesses and forward progress was
still being made because of the outer loop) but it did regress
the performance of header field parsing rather massively.

Taking the test suite as an example: the inner fast path loop
was skipped over 4.4 million times, falling back to the outer
slow path loop. After this commit that only happens about
2,000 times - a 2,200-fold reduction.

Fixes: https://github.com/nodejs/http-parser/issues/473
PR-URL: https://github.com/nodejs/http-parser/pull/474
Reviewed-By: Fedor Indutny <fedor.indutny@gmail.com>
master
Ben Noordhuis 6 years ago
parent b6866a7619
commit c7d49252a8

@ -1257,9 +1257,9 @@ reexecute:
switch (parser->header_state) { switch (parser->header_state) {
case h_general: { case h_general: {
size_t limit = data + len - p; size_t left = data + len - p;
limit = MIN(limit, max_header_size); const char* pe = p + MIN(left, max_header_size);
while (p+1 < data + limit && TOKEN(p[1])) { while (p+1 < pe && TOKEN(p[1])) {
p++; p++;
} }
break; break;

Loading…
Cancel
Save