avoid assertion failure in error case

Without this change, it is possible to get an assertion to fail by
continuing to call http_parser_execute after it has returned an error.
Specifically, the parser could be called with parser->state ==
s_chunk_size_almost_done and parser->flags & F_CHUNKED set.  Then,
F_CHUNKED could have been cleared, and an error could be hit.  In this
case, the parser would have returned with F_CHUNKED clear, but
parser->state == s_chunk_size_almost_done, resulting in an assertion
failure on the next call.

There are alternate solutions possible, including just saving all of
the fields (state included) on error.

I didn't add a test case because this is a bit annoying to test, but I
can add one if necesssary.
event_stream
Cliff Frey 14 years ago committed by Ryan Dahl
parent cbb194ea8c
commit 459507f534

@ -1545,6 +1545,7 @@ size_t http_parser_execute (http_parser *parser,
return len; return len;
error: error:
parser->state = s_dead;
return (p - data); return (p - data);
} }

Loading…
Cancel
Save