From cacb07d2b4ebcd86fc44fd6ee3f0020125e7a9a6 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sun, 3 Jul 2016 06:41:11 +0200 Subject: [PATCH] parser: fix Content-Length header parsing. Commit e2e467b ("Update http-parser to 2.6.1") enforces that messages contain no more than one Content-Length header but it considers any header that starts with "Content-Length" as a duplicate. Fix: https://github.com/nodejs/http-parser/issues/324 PR-URL: https://github.com/nodejs/http-parser/pull/325 Reviewed-By: Fedor Indutny Reviewed-By: James M Snell --- http_parser.c | 11 ++++++----- test.c | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/http_parser.c b/http_parser.c index 3c896ff..895bf0c 100644 --- a/http_parser.c +++ b/http_parser.c @@ -1366,12 +1366,7 @@ reexecute: || c != CONTENT_LENGTH[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { - if (parser->flags & F_CONTENTLENGTH) { - SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); - goto error; - } parser->header_state = h_content_length; - parser->flags |= F_CONTENTLENGTH; } break; @@ -1474,6 +1469,12 @@ reexecute: goto error; } + if (parser->flags & F_CONTENTLENGTH) { + SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH); + goto error; + } + + parser->flags |= F_CONTENTLENGTH; parser->content_length = ch - '0'; break; diff --git a/test.c b/test.c index 2c18a80..f5744aa 100644 --- a/test.c +++ b/test.c @@ -1745,6 +1745,32 @@ const struct message responses[] = ,.body= "" } +#define CONTENT_LENGTH_X 21 +, {.name= "Content-Length-X" + ,.type= HTTP_RESPONSE + ,.raw= "HTTP/1.1 200 OK\r\n" + "Content-Length-X: 0\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n" + "2\r\n" + "OK\r\n" + "0\r\n" + "\r\n" + ,.should_keep_alive= TRUE + ,.message_complete_on_eof= FALSE + ,.http_major= 1 + ,.http_minor= 1 + ,.status_code= 200 + ,.response_status= "OK" + ,.num_headers= 2 + ,.headers= { { "Content-Length-X", "0" } + , { "Transfer-Encoding", "chunked" } + } + ,.body= "OK" + ,.num_chunks_complete= 2 + ,.chunk_lengths= { 2 } + } + , {.name= NULL } /* sentinel */ };