aboutsummaryrefslogtreecommitdiff
path: root/networking/httpd.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2019-04-16 11:07:37 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-04-16 11:07:37 +0200
commitd0ae4103ddca21b7b765347611a9cf33f0cccd74 (patch)
tree5e38377bac5b35b436dc3a6af20254e596a5a757 /networking/httpd.c
parentff36bec49b2a1e398a5d7731a7049662f5c1b4ec (diff)
downloadbusybox-d0ae4103ddca21b7b765347611a9cf33f0cccd74.tar.gz
httpd: fix handling of EOF in get_line()
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/httpd.c')
-rw-r--r--networking/httpd.c18
1 files 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;
}