httpd: fix handling of EOF in get_line()
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 16 Apr 2019 09:07:37 +0000 (11:07 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 16 Apr 2019 09:07:37 +0000 (11:07 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/httpd.c

index 50e832c1fd4d3f2335f7d2c682540a2e49e55bbf..53be500d3fe3d062260783aef77b927a3c7528cb 100644 (file)
@@ -1194,7 +1194,8 @@ static void send_headers_and_exit(int responseNum)
 }
 
 /*
- * Read from the socket until '\n' or EOF. '\r' chars are removed.
+ * Read from the socket until '\n' or EOF.
+ * '\r' chars are removed.
  * '\n' is replaced with NUL.
  * Return number of characters read or 0 if nothing is read
  * ('\r' and '\n' are not counted).
@@ -1202,29 +1203,30 @@ static void send_headers_and_exit(int responseNum)
  */
 static int get_line(void)
 {
-       int count = 0;
+       int count;
        char c;
 
        alarm(HEADER_READ_TIMEOUT);
+       count = 0;
        while (1) {
                if (hdr_cnt <= 0) {
                        hdr_cnt = safe_read(STDIN_FILENO, hdr_buf, sizeof_hdr_buf);
                        if (hdr_cnt <= 0)
-                               break;
+                               goto ret;
                        hdr_ptr = hdr_buf;
                }
-               iobuf[count] = c = *hdr_ptr++;
                hdr_cnt--;
-
+               c = *hdr_ptr++;
                if (c == '\r')
                        continue;
-               if (c == '\n') {
-                       iobuf[count] = '\0';
+               if (c == '\n')
                        break;
-               }
+               iobuf[count] = c;
                if (count < (IOBUF_SIZE - 1))      /* check overflow */
                        count++;
        }
+ ret:
+       iobuf[count] = '\0';
        return count;
 }