fix error detection in parse_request_line/parse_response_line

Fri, 06 Feb 2026 14:16:09 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 06 Feb 2026 14:16:09 +0100
changeset 663
bd116bd44926
parent 662
70fdf948b642
child 664
9b1066313c17

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);
     }
 }

mercurial