diff options
author | Matthew Wild <mwild1@gmail.com> | 2023-02-17 17:01:19 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2023-02-17 17:01:19 +0000 |
commit | 87ee5a2300ef296fc3c11e6d3d1c9be23d289252 (patch) | |
tree | 05c9ff9930ebabadac3e12b495a9319f5c4b6fb9 /net/http | |
parent | 67ea0ee50ecd5886099e639f847acff9f28fd6e2 (diff) | |
download | prosody-87ee5a2300ef296fc3c11e6d3d1c9be23d289252.tar.gz prosody-87ee5a2300ef296fc3c11e6d3d1c9be23d289252.zip |
net.http.parser: Fix off-by-one error in chunk parser
Diffstat (limited to 'net/http')
-rw-r--r-- | net/http/parser.lua | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/net/http/parser.lua b/net/http/parser.lua index b95d9017..a6624662 100644 --- a/net/http/parser.lua +++ b/net/http/parser.lua @@ -153,6 +153,7 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) if not chunk_size then return; end chunk_size = chunk_size and tonumber(chunk_size, 16); if not chunk_size then error = true; return error_cb("invalid-chunk-size"); end + if chunk_size == 0 and chunk_header:find("\r\n\r\n", chunk_start-2, true) then local body_buffer = packet.body_buffer; if body_buffer then @@ -168,8 +169,8 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) state, chunked = nil, nil; packet.partial = nil; success_cb(packet); - elseif buffer:length() - chunk_start - 2 >= chunk_size then -- we have a chunk - buffer:discard(chunk_start - 1); -- TODO verify that it's not off-by-one + elseif buffer:length() - chunk_start - 1 >= chunk_size then -- we have a chunk + buffer:discard(chunk_start - 1); (packet.body_sink or packet.body_buffer):write(buffer:read(chunk_size)); buffer:discard(2); -- CRLF else -- Partial chunk remaining |