diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-16 11:07:37 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-04-16 11:07:37 +0200 |
| commit | d0ae4103ddca21b7b765347611a9cf33f0cccd74 (patch) | |
| tree | 5e38377bac5b35b436dc3a6af20254e596a5a757 | |
| parent | ff36bec49b2a1e398a5d7731a7049662f5c1b4ec (diff) | |
| download | busybox-w32-d0ae4103ddca21b7b765347611a9cf33f0cccd74.tar.gz busybox-w32-d0ae4103ddca21b7b765347611a9cf33f0cccd74.tar.bz2 busybox-w32-d0ae4103ddca21b7b765347611a9cf33f0cccd74.zip | |
httpd: fix handling of EOF in get_line()
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -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 50e832c1f..53be500d3 100644 --- a/networking/httpd.c +++ b/networking/httpd.c | |||
| @@ -1194,7 +1194,8 @@ static void send_headers_and_exit(int responseNum) | |||
| 1194 | } | 1194 | } |
| 1195 | 1195 | ||
| 1196 | /* | 1196 | /* |
| 1197 | * Read from the socket until '\n' or EOF. '\r' chars are removed. | 1197 | * Read from the socket until '\n' or EOF. |
| 1198 | * '\r' chars are removed. | ||
| 1198 | * '\n' is replaced with NUL. | 1199 | * '\n' is replaced with NUL. |
| 1199 | * Return number of characters read or 0 if nothing is read | 1200 | * Return number of characters read or 0 if nothing is read |
| 1200 | * ('\r' and '\n' are not counted). | 1201 | * ('\r' and '\n' are not counted). |
| @@ -1202,29 +1203,30 @@ static void send_headers_and_exit(int responseNum) | |||
| 1202 | */ | 1203 | */ |
| 1203 | static int get_line(void) | 1204 | static int get_line(void) |
| 1204 | { | 1205 | { |
| 1205 | int count = 0; | 1206 | int count; |
| 1206 | char c; | 1207 | char c; |
| 1207 | 1208 | ||
| 1208 | alarm(HEADER_READ_TIMEOUT); | 1209 | alarm(HEADER_READ_TIMEOUT); |
| 1210 | count = 0; | ||
| 1209 | while (1) { | 1211 | while (1) { |
| 1210 | if (hdr_cnt <= 0) { | 1212 | if (hdr_cnt <= 0) { |
| 1211 | hdr_cnt = safe_read(STDIN_FILENO, hdr_buf, sizeof_hdr_buf); | 1213 | hdr_cnt = safe_read(STDIN_FILENO, hdr_buf, sizeof_hdr_buf); |
| 1212 | if (hdr_cnt <= 0) | 1214 | if (hdr_cnt <= 0) |
| 1213 | break; | 1215 | goto ret; |
| 1214 | hdr_ptr = hdr_buf; | 1216 | hdr_ptr = hdr_buf; |
| 1215 | } | 1217 | } |
| 1216 | iobuf[count] = c = *hdr_ptr++; | ||
| 1217 | hdr_cnt--; | 1218 | hdr_cnt--; |
| 1218 | 1219 | c = *hdr_ptr++; | |
| 1219 | if (c == '\r') | 1220 | if (c == '\r') |
| 1220 | continue; | 1221 | continue; |
| 1221 | if (c == '\n') { | 1222 | if (c == '\n') |
| 1222 | iobuf[count] = '\0'; | ||
| 1223 | break; | 1223 | break; |
| 1224 | } | 1224 | iobuf[count] = c; |
| 1225 | if (count < (IOBUF_SIZE - 1)) /* check overflow */ | 1225 | if (count < (IOBUF_SIZE - 1)) /* check overflow */ |
| 1226 | count++; | 1226 | count++; |
| 1227 | } | 1227 | } |
| 1228 | ret: | ||
| 1229 | iobuf[count] = '\0'; | ||
| 1228 | return count; | 1230 | return count; |
| 1229 | } | 1231 | } |
| 1230 | 1232 | ||
