Skip to content

Commit bb0f8fe

Browse files
committed
Fix leaks in error path of the bufferevent_init_common_()
(cherry picked from commit 6995b9a)
1 parent b6724b6 commit bb0f8fe

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

bufferevent.c

+19-15
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,12 @@ bufferevent_init_common_(struct bufferevent_private *bufev_private,
315315

316316
if (!bufev->input) {
317317
if ((bufev->input = evbuffer_new()) == NULL)
318-
return -1;
318+
goto err;
319319
}
320320

321321
if (!bufev->output) {
322-
if ((bufev->output = evbuffer_new()) == NULL) {
323-
evbuffer_free(bufev->input);
324-
return -1;
325-
}
322+
if ((bufev->output = evbuffer_new()) == NULL)
323+
goto err;
326324
}
327325

328326
bufev_private->refcnt = 1;
@@ -334,7 +332,8 @@ bufferevent_init_common_(struct bufferevent_private *bufev_private,
334332

335333
bufev->be_ops = ops;
336334

337-
bufferevent_ratelim_init_(bufev_private);
335+
if (bufferevent_ratelim_init_(bufev_private))
336+
goto err;
338337

339338
/*
340339
* Set to EV_WRITE so that using bufferevent_write is going to
@@ -345,20 +344,14 @@ bufferevent_init_common_(struct bufferevent_private *bufev_private,
345344

346345
#ifndef EVENT__DISABLE_THREAD_SUPPORT
347346
if (options & BEV_OPT_THREADSAFE) {
348-
if (bufferevent_enable_locking_(bufev, NULL) < 0) {
349-
/* cleanup */
350-
evbuffer_free(bufev->input);
351-
evbuffer_free(bufev->output);
352-
bufev->input = NULL;
353-
bufev->output = NULL;
354-
return -1;
355-
}
347+
if (bufferevent_enable_locking_(bufev, NULL) < 0)
348+
goto err;
356349
}
357350
#endif
358351
if ((options & (BEV_OPT_DEFER_CALLBACKS|BEV_OPT_UNLOCK_CALLBACKS))
359352
== BEV_OPT_UNLOCK_CALLBACKS) {
360353
event_warnx("UNLOCK_CALLBACKS requires DEFER_CALLBACKS");
361-
return -1;
354+
goto err;
362355
}
363356
if (options & BEV_OPT_UNLOCK_CALLBACKS)
364357
event_deferred_cb_init_(
@@ -379,6 +372,17 @@ bufferevent_init_common_(struct bufferevent_private *bufev_private,
379372
evbuffer_set_parent_(bufev->output, bufev);
380373

381374
return 0;
375+
376+
err:
377+
if (bufev->input) {
378+
evbuffer_free(bufev->input);
379+
bufev->input = NULL;
380+
}
381+
if (bufev->output) {
382+
evbuffer_free(bufev->output);
383+
bufev->output = NULL;
384+
}
385+
return -1;
382386
}
383387

384388
void

0 commit comments

Comments
 (0)