increase segment refcnt only if evbuffer_add_file_segment() succeeds

(cherry picked from commit 114b3836755f1e526e658b248464465136bd87b8)
This commit is contained in:
yuangongji 2020-02-29 17:47:47 +08:00 committed by Azat Khuzhin
parent 6f8e0e97e5
commit 30662a3ca9

View File

@ -3209,7 +3209,6 @@ evbuffer_add_file_segment(struct evbuffer *buf,
} }
} }
} }
++seg->refcnt;
EVLOCK_UNLOCK(seg->lock, 0); EVLOCK_UNLOCK(seg->lock, 0);
if (buf->freeze_end) if (buf->freeze_end)
@ -3273,6 +3272,9 @@ evbuffer_add_file_segment(struct evbuffer *buf,
chain->off = length; chain->off = length;
} }
EVLOCK_LOCK(seg->lock, 0);
++seg->refcnt;
EVLOCK_UNLOCK(seg->lock, 0);
extra->segment = seg; extra->segment = seg;
buf->n_add_for_cb += length; buf->n_add_for_cb += length;
evbuffer_chain_insert(buf, chain); evbuffer_chain_insert(buf, chain);
@ -3299,7 +3301,7 @@ evbuffer_add_file(struct evbuffer *buf, int fd, ev_off_t offset, ev_off_t length
if (!seg) if (!seg)
return -1; return -1;
r = evbuffer_add_file_segment(buf, seg, 0, length); r = evbuffer_add_file_segment(buf, seg, 0, length);
if (r == -1) if (r == 0)
evbuffer_file_segment_free(seg); evbuffer_file_segment_free(seg);
return r; return r;
} }