diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-07-19 17:01:17 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-07-19 17:01:17 +0400 |
commit | fd4de5a9277d8d4a75b2258b4e1f8cf20c8e0e1d (patch) | |
tree | 7a8ea53e842e815f6add4b2abf267ffcc0c4d549 /src/map.c | |
parent | 6a2422fe75904e8072bdf48502d0245f89e1a0e2 (diff) | |
download | rspamd-fd4de5a9277d8d4a75b2258b4e1f8cf20c8e0e1d.tar.gz rspamd-fd4de5a9277d8d4a75b2258b4e1f8cf20c8e0e1d.zip |
Fix coredumps on some specific messages with specific urls.
Fix coredumps while closing log file.
Fix parsing of chunked HTTP replies.
Diffstat (limited to 'src/map.c')
-rw-r--r-- | src/map.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -236,9 +236,9 @@ read_http_chunked (u_char * buf, size_t len, struct rspamd_map *map, struct http /* Read first chunk data */ skip = read_chunk_header (buf, len, data); p += skip; + len -= skip; } - len -= skip; data->chunk_read += len; if (data->chunk_read >= data->chunk) { /* Read next chunk and feed callback with remaining buffer */ @@ -247,9 +247,11 @@ read_http_chunked (u_char * buf, size_t len, struct rspamd_map *map, struct http /* copy remaining buffer to start of buffer */ data->rlen = len - (remain - p); memmove (p, remain, data->rlen); + data->chunk_read -= data->rlen; } - - p = buf + (len - (data->chunk_read - data->chunk)); + } + if (data->chunk_read >= data->chunk) { + p = p + (len - (data->chunk_read - data->chunk)); if (*p != '\r') { if (*p == '0') { return TRUE; @@ -903,6 +905,11 @@ http_async_callback (gint fd, short what, void *ud) cbd->cbdata.state = 0; cbd->cbdata.prev_data = *cbd->map->user_data; cbd->cbdata.cur_data = NULL; + cbd->data->rlen = 0; + cbd->data->chunk = 0; + cbd->data->chunk_read = 0; + cbd->data->chunked = FALSE; + cbd->data->read_buf[0] = '\0'; event_add (&cbd->ev, &cbd->tv); } |