mirror of
https://github.com/sonertari/SSLproxy
synced 2024-11-02 15:40:19 +00:00
Do not do anything else with ctx while returning from topmost callback functions if it is freed
Handle out of memory conditions correctly
This commit is contained in:
parent
2aeec751e0
commit
cbb9d593c4
20
pxyconn.c
20
pxyconn.c
@ -297,6 +297,7 @@ pxy_conn_ctx_free_child(pxy_conn_child_ctx_t *ctx)
|
|||||||
}
|
}
|
||||||
free(ctx->protoctx);
|
free(ctx->protoctx);
|
||||||
free(ctx);
|
free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NONNULL(1,2)
|
static void NONNULL(1,2)
|
||||||
@ -397,6 +398,7 @@ pxy_conn_ctx_free(pxy_conn_ctx_t *ctx, int by_requestor)
|
|||||||
}
|
}
|
||||||
free(ctx->protoctx);
|
free(ctx->protoctx);
|
||||||
free(ctx);
|
free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -797,9 +799,7 @@ pxy_malloc_packet(size_t sz, pxy_conn_ctx_t *ctx)
|
|||||||
{
|
{
|
||||||
unsigned char *packet = malloc(sz);
|
unsigned char *packet = malloc(sz);
|
||||||
if (!packet) {
|
if (!packet) {
|
||||||
// @todo Should we just set enomem?
|
|
||||||
ctx->enomem = 1;
|
ctx->enomem = 1;
|
||||||
pxy_conn_free(ctx, 1);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return packet;
|
return packet;
|
||||||
@ -1230,6 +1230,10 @@ pxy_bev_readcb(struct bufferevent *bev, void *arg)
|
|||||||
ctx->atime = time(NULL);
|
ctx->atime = time(NULL);
|
||||||
ctx->protoctx->bev_readcb(bev, ctx);
|
ctx->protoctx->bev_readcb(bev, ctx);
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* out of memory condition? */
|
/* out of memory condition? */
|
||||||
if (ctx->enomem) {
|
if (ctx->enomem) {
|
||||||
pxy_conn_free(ctx, (bev == ctx->src.bev));
|
pxy_conn_free(ctx, (bev == ctx->src.bev));
|
||||||
@ -1265,6 +1269,10 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg)
|
|||||||
ctx->conn->atime = time(NULL);
|
ctx->conn->atime = time(NULL);
|
||||||
ctx->protoctx->bev_readcb(bev, ctx);
|
ctx->protoctx->bev_readcb(bev, ctx);
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* out of memory condition? */
|
/* out of memory condition? */
|
||||||
if (ctx->conn->enomem) {
|
if (ctx->conn->enomem) {
|
||||||
pxy_conn_free(ctx->conn, (bev == ctx->src.bev));
|
pxy_conn_free(ctx->conn, (bev == ctx->src.bev));
|
||||||
@ -1312,6 +1320,10 @@ pxy_bev_eventcb(struct bufferevent *bev, short events, void *arg)
|
|||||||
|
|
||||||
ctx->protoctx->bev_eventcb(bev, events, arg);
|
ctx->protoctx->bev_eventcb(bev, events, arg);
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (events & BEV_EVENT_CONNECTED) {
|
if (events & BEV_EVENT_CONNECTED) {
|
||||||
// Passthrough proto does its own connect logging
|
// Passthrough proto does its own connect logging
|
||||||
if (ctx->proto != PROTO_PASSTHROUGH) {
|
if (ctx->proto != PROTO_PASSTHROUGH) {
|
||||||
@ -1355,6 +1367,10 @@ pxy_bev_eventcb_child(struct bufferevent *bev, short events, void *arg)
|
|||||||
|
|
||||||
ctx->protoctx->bev_eventcb(bev, events, arg);
|
ctx->protoctx->bev_eventcb(bev, events, arg);
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (events & BEV_EVENT_CONNECTED) {
|
if (events & BEV_EVENT_CONNECTED) {
|
||||||
ctx->conn->thr->max_fd = MAX(ctx->conn->thr->max_fd, MAX(bufferevent_getfd(ctx->src.bev), bufferevent_getfd(ctx->dst.bev)));
|
ctx->conn->thr->max_fd = MAX(ctx->conn->thr->max_fd, MAX(bufferevent_getfd(ctx->src.bev), bufferevent_getfd(ctx->dst.bev)));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user