Fri, 06 Feb 2026 14:16:09 +0100
fix error detection in parse_request_line/parse_response_line
| src/server/daemon/httpparser.c | file | annotate | diff | comparison | revisions | |
| src/server/test/httpparser.c | file | annotate | diff | comparison | revisions |
--- a/src/server/daemon/httpparser.c Fri Feb 06 14:06:04 2026 +0100 +++ b/src/server/daemon/httpparser.c Fri Feb 06 14:16:09 2026 +0100 @@ -220,7 +220,7 @@ } } } - if(i == line.length) { + if(i == line.length || parser->method.length == 0) { return 1; } @@ -277,6 +277,9 @@ } } } + if(i == line.length || parser->httpv.length == 0) { + return 1; + } ns = 0; int s = i; @@ -314,6 +317,6 @@ } } - return 0; + return parser->msg.length == 0; }
--- a/src/server/test/httpparser.c Fri Feb 06 14:06:04 2026 +0100 +++ b/src/server/test/httpparser.c Fri Feb 06 14:16:09 2026 +0100 @@ -99,6 +99,14 @@ parser.start_line = cx_mutstr("GET /uri HTTP/1.1 test\r\n"); int nret6 = parse_request_line(&parser); CX_TEST_ASSERT(nret6); + + parser.start_line = cx_mutstr(" /uri2 HTTP/1.1\r\n"); + int nret7 = parse_request_line(&parser); + CX_TEST_ASSERT(nret7); + + parser.start_line = cx_mutstr("GET HTTP/1.1\r\n"); + int nret8 = parse_request_line(&parser); + CX_TEST_ASSERT(nret8); } } @@ -132,5 +140,42 @@ CX_TEST_ASSERT(!cx_strcmp(parser.httpv, "HTTP/0.9")); CX_TEST_ASSERT(!cx_strcmp(parser.msg, "No Content")); CX_TEST_ASSERT(parser.status == 204); + + // negative tests + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr("HTTP/1.1 200\r\n"); + parser.type = 1; + int nret1 = parse_response_line(&parser); + CX_TEST_ASSERT(nret1); + + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr("\r\n"); + parser.type = 1; + int nret2 = parse_response_line(&parser); + CX_TEST_ASSERT(nret2); + + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr("200\r\n"); + parser.type = 1; + int nret3 = parse_response_line(&parser); + CX_TEST_ASSERT(nret3); + + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr("HTTP/1.1 2345 Test Message\r\n"); + parser.type = 1; + int nret4 = parse_response_line(&parser); + CX_TEST_ASSERT(nret4); + + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr("HTTP/1.1 xy1 OK\r\n"); + parser.type = 1; + int nret5 = parse_response_line(&parser); + CX_TEST_ASSERT(nret5); + + memset(&parser, 0, sizeof(HttpParser)); + parser.start_line = cx_mutstr(" 200 OK\r\n"); + parser.type = 1; + int nret6 = parse_response_line(&parser); + CX_TEST_ASSERT(nret6); } }