diff options
Diffstat (limited to 'opentracker.c')
| -rw-r--r-- | opentracker.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/opentracker.c b/opentracker.c index 0ae98e6..354e837 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -163,7 +163,7 @@ static void handle_dead(const int64 sock) { | |||
| 163 | for (i = 0; i < cookie->batches; ++i) | 163 | for (i = 0; i < cookie->batches; ++i) |
| 164 | iob_reset(cookie->batch + i); | 164 | iob_reset(cookie->batch + i); |
| 165 | free(cookie->batch); | 165 | free(cookie->batch); |
| 166 | array_reset(&cookie->request); | 166 | buf_reset(&cookie->request); |
| 167 | if (cookie->flag & (STRUCT_HTTP_FLAG_WAITINGFORTASK | STRUCT_HTTP_FLAG_CHUNKED_IN_TRANSFER)) | 167 | if (cookie->flag & (STRUCT_HTTP_FLAG_WAITINGFORTASK | STRUCT_HTTP_FLAG_CHUNKED_IN_TRANSFER)) |
| 168 | mutex_workqueue_canceltask(sock); | 168 | mutex_workqueue_canceltask(sock); |
| 169 | free(cookie); | 169 | free(cookie); |
| @@ -189,25 +189,24 @@ static void handle_read(const int64 sock, struct ot_workstruct *ws) { | |||
| 189 | ws->keep_alive = 0; | 189 | ws->keep_alive = 0; |
| 190 | 190 | ||
| 191 | /* If we get the whole request in one packet, handle it without copying */ | 191 | /* If we get the whole request in one packet, handle it without copying */ |
| 192 | if (!array_start(&cookie->request)) { | 192 | if (!cookie->request.data) { |
| 193 | if ((ws->header_size = header_complete(ws->inbuf, byte_count))) { | 193 | if ((ws->header_size = header_complete(ws->inbuf, byte_count))) { |
| 194 | ws->request = ws->inbuf; | 194 | ws->request = ws->inbuf; |
| 195 | ws->request_size = byte_count; | 195 | ws->request_size = byte_count; |
| 196 | http_handle_request(sock, ws); | 196 | http_handle_request(sock, ws); |
| 197 | } else | 197 | } else if (buf_cat(&cookie->request, ws->inbuf, (size_t)byte_count)) |
| 198 | array_catb(&cookie->request, ws->inbuf, (size_t)byte_count); | 198 | handle_dead(sock); |
| 199 | return; | 199 | return; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | array_catb(&cookie->request, ws->inbuf, byte_count); | 202 | if (buf_cat(&cookie->request, ws->inbuf, (size_t)byte_count) || cookie->request.size > G_INBUF_SIZE) { |
| 203 | if (array_failed(&cookie->request) || array_bytes(&cookie->request) > 8192) { | ||
| 204 | http_issue_error(sock, ws, CODE_HTTPERROR_500); | 203 | http_issue_error(sock, ws, CODE_HTTPERROR_500); |
| 205 | return; | 204 | return; |
| 206 | } | 205 | } |
| 207 | 206 | ||
| 208 | while ((ws->header_size = header_complete(array_start(&cookie->request), array_bytes(&cookie->request)))) { | 207 | while ((ws->header_size = header_complete(cookie->request.data, (ssize_t)cookie->request.size))) { |
| 209 | ws->request = array_start(&cookie->request); | 208 | ws->request = cookie->request.data; |
| 210 | ws->request_size = array_bytes(&cookie->request); | 209 | ws->request_size = (ssize_t)cookie->request.size; |
| 211 | http_handle_request(sock, ws); | 210 | http_handle_request(sock, ws); |
| 212 | #ifdef WANT_KEEPALIVE | 211 | #ifdef WANT_KEEPALIVE |
| 213 | if (!ws->keep_alive) | 212 | if (!ws->keep_alive) |
