summaryrefslogtreecommitdiff
path: root/opentracker.c
diff options
context:
space:
mode:
Diffstat (limited to 'opentracker.c')
-rw-r--r--opentracker.c17
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)