# HG changeset patch # User Olaf Wintermann # Date 1770383769 -3600 # Node ID bd116bd449260178bcf5c8e40da403759d6b8ec8 # Parent 70fdf948b642aa807f4b8b5edd0b5abd1caef2bc fix error detection in parse_request_line/parse_response_line diff -r 70fdf948b642 -r bd116bd44926 src/server/daemon/httpparser.c --- 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; } diff -r 70fdf948b642 -r bd116bd44926 src/server/test/httpparser.c --- 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); } }