Skip to content

Commit 86777d9

Browse files
committed
Disable r/w cbs and clear all cbs before all bufferevent_free() calls
Also, disable the events first, then clear the callbacks, for conventional pattern.
1 parent 5ef3e69 commit 86777d9

File tree

3 files changed

+7
-3
lines changed

3 files changed

+7
-3
lines changed

src/protoautossl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ protoautossl_bufferevent_free_and_close_fd(struct bufferevent *bev, pxy_conn_ctx
8484
evbuffer_get_length(bufferevent_get_output(bev)), ubev ? evbuffer_get_length(bufferevent_get_output(ubev)) : 0, fd);
8585

8686
// @see https://stackoverflow.com/questions/31688709/knowing-all-callbacks-have-run-with-libevent-and-bufferevent-free
87+
bufferevent_disable(bev, EV_READ|EV_WRITE);
8788
bufferevent_setcb(bev, NULL, NULL, NULL, NULL);
8889

8990
/*
@@ -95,11 +96,10 @@ protoautossl_bufferevent_free_and_close_fd(struct bufferevent *bev, pxy_conn_ctx
9596
SSL_set_shutdown(ssl, SSL_RECEIVED_SHUTDOWN);
9697
SSL_shutdown(ssl);
9798

98-
bufferevent_disable(bev, EV_READ|EV_WRITE);
9999
if (ubev) {
100100
bufferevent_disable(ubev, EV_READ|EV_WRITE);
101-
bufferevent_setfd(ubev, -1);
102101
bufferevent_setcb(ubev, NULL, NULL, NULL, NULL);
102+
bufferevent_setfd(ubev, -1);
103103
bufferevent_free(ubev);
104104
}
105105
bufferevent_free(bev);

src/protossl.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,7 @@ protossl_bufferevent_free_and_close_fd(struct bufferevent *bev, pxy_conn_ctx_t *
12571257
SSL_shutdown(ssl);
12581258

12591259
bufferevent_disable(bev, EV_READ|EV_WRITE);
1260+
bufferevent_setcb(bev, NULL, NULL, NULL, NULL);
12601261
bufferevent_free(bev);
12611262

12621263
if (OPTS_DEBUG(ctx->global)) {

src/prototcp.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ prototcp_bufferevent_free_and_close_fd(struct bufferevent *bev, UNUSED pxy_conn_
107107

108108
log_finer_va("in=%zu, out=%zu, fd=%d", evbuffer_get_length(bufferevent_get_input(bev)), evbuffer_get_length(bufferevent_get_output(bev)), fd);
109109

110+
bufferevent_disable(bev, EV_READ|EV_WRITE);
111+
bufferevent_setcb(bev, NULL, NULL, NULL, NULL);
112+
110113
bufferevent_free(bev);
111114
if (fd >= 0)
112115
evutil_closesocket(fd);
@@ -132,8 +135,8 @@ prototcp_disable_srvdst(pxy_conn_ctx_t *ctx)
132135
log_finest("ENTER");
133136

134137
// Do not disable underlying bevs in autossl
135-
bufferevent_setcb(ctx->srvdst.bev, NULL, NULL, NULL, NULL);
136138
bufferevent_disable(ctx->srvdst.bev, EV_READ|EV_WRITE);
139+
bufferevent_setcb(ctx->srvdst.bev, NULL, NULL, NULL, NULL);
137140

138141
// Do not access srvdst.bev from this point on
139142
ctx->srvdst.bev = NULL;

0 commit comments

Comments
 (0)