diff options
Diffstat (limited to 'buffer.c')
-rw-r--r-- | buffer.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -1421,9 +1421,11 @@ evbuffer_pullup(struct evbuffer *buf, ev_ssize_t size) for (; chain != NULL && (size_t)size >= chain->off; chain = next) { next = chain->next; - memcpy(buffer, chain->buffer + chain->misalign, chain->off); - size -= chain->off; - buffer += chain->off; + if (chain->buffer) { + memcpy(buffer, chain->buffer + chain->misalign, chain->off); + size -= chain->off; + buffer += chain->off; + } if (chain == last_with_data) removed_last_with_data = 1; if (&chain->next == buf->last_with_datap) @@ -3209,7 +3211,6 @@ evbuffer_add_file_segment(struct evbuffer *buf, } } } - ++seg->refcnt; EVLOCK_UNLOCK(seg->lock, 0); if (buf->freeze_end) @@ -3273,6 +3274,9 @@ evbuffer_add_file_segment(struct evbuffer *buf, chain->off = length; } + EVLOCK_LOCK(seg->lock, 0); + ++seg->refcnt; + EVLOCK_UNLOCK(seg->lock, 0); extra->segment = seg; buf->n_add_for_cb += length; evbuffer_chain_insert(buf, chain); |