mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-01 05:02:29 +07:00
* reject control characters in chunk extensions in read_payload * Bound every chunk-size line scan by the line terminator read_payload() ended its scans of one line buffer two different ways: the hex-size parse and the space skip that follows stopped on the NUL that stream_line_reader::append() writes, while the new chunk-ext check walked to an explicit end pointer. Compute that end pointer first and bound all of them by it, so no scan depends on the buffer's NUL and the terminator can never be read as line content. The bare-LF branch is reachable only under CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR, where getline() ends the line on an LF that is the terminator rather than extension text. Say so: the comment below it explains why a bare LF inside the line is rejected, and without that note the two read as contradictory. Its guard no longer depends on the scan cursor either, since all it ever needed was a check that there is a byte to look at. * Reuse the chunked-body helper in the chunk-ext acceptance test AcceptsChunkExtension repeated expect_chunked_body_rejected()'s body verbatim apart from the expected status, so parameterise the helper on the status and keep the rejection wrapper for the existing callers. The decoded body is already checked by the /chunked handler, so asserting the status is all the new test needs. Also record why the control-character literal stays split: a hex escape consumes every hex digit that follows it, so "\x01b" would be the single byte \x1b rather than \x01 followed by 'b', and joining the halves would quietly change what the test sends. --------- Co-authored-by: yhirose <yuji.hirose.bug@gmail.com>