From f45d39d1a45b762a48b6648672ee66019d74e877 Mon Sep 17 00:00:00 2001 From: Bill Vaughan Date: Fri, 24 Jul 2015 05:40:59 -0700 Subject: [PATCH] Fix lock leak in be_pair_flush() if flush type is BEV_NORMAL Fixes: bufferevent/bufferevent_pair_flush_normal $ regress --no-fork bufferevent/bufferevent_pair_flush_normal bufferevent/bufferevent_pair_flush_normal: FAIL ../test/regress_bufferevent.c:181: assert(bufferevent_pair_get_partner(bev1) == NULL): 0x177fa20 vs (nil) [bufferevent_pair_flush_normal FAILED] Fixes #266 --- bufferevent_pair.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bufferevent_pair.c b/bufferevent_pair.c index 8154e17b..d80e5f81 100644 --- a/bufferevent_pair.c +++ b/bufferevent_pair.c @@ -307,15 +307,17 @@ be_pair_flush(struct bufferevent *bev, short iotype, { struct bufferevent_pair *bev_p = upcast(bev); struct bufferevent *partner; - incref_and_lock(bev); + if (!bev_p->partner) return -1; - partner = downcast(bev_p->partner); - if (mode == BEV_NORMAL) return 0; + incref_and_lock(bev); + + partner = downcast(bev_p->partner); + if ((iotype & EV_READ) != 0) be_pair_transfer(partner, bev, 1);