[git commit] httpd: fix handling of EOF in get_line()

Denys Vlasenko vda.linux at googlemail.com
Tue Apr 16 09:07:37 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=d0ae4103ddca21b7b765347611a9cf33f0cccd74
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 networking/httpd.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/networking/httpd.c b/networking/httpd.c
index 50e832c1f..53be500d3 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -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;
 }
 


More information about the busybox-cvs mailing list