diff options
author | Denys Vlasenko | 2019-04-16 11:07:37 +0200 |
---|---|---|
committer | Denys Vlasenko | 2019-04-16 11:07:37 +0200 |
commit | d0ae4103ddca21b7b765347611a9cf33f0cccd74 (patch) | |
tree | 5e38377bac5b35b436dc3a6af20254e596a5a757 /networking | |
parent | ff36bec49b2a1e398a5d7731a7049662f5c1b4ec (diff) | |
download | busybox-d0ae4103ddca21b7b765347611a9cf33f0cccd74.zip busybox-d0ae4103ddca21b7b765347611a9cf33f0cccd74.tar.gz |
httpd: fix handling of EOF in get_line()
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r-- | networking/httpd.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/networking/httpd.c b/networking/httpd.c index 50e832c..53be500 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; } |