From 080604e3c23cbebe32d0885495ab041e1851ce9a Mon Sep 17 00:00:00 2001 From: Daniel Roethlisberger Date: Fri, 23 Aug 2013 16:56:12 +0200 Subject: [PATCH] Fix segfault after thread manager start failure This should fix the segmentation fault in issue #10 but not the underlying reason why the thread manager fails to start in the first place. Issue: #10 Reported by: linuxton --- proxy.c | 12 +++++++++--- pxythrmgr.c | 33 +++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/proxy.c b/proxy.c index bfd3cff..5e828e5 100644 --- a/proxy.c +++ b/proxy.c @@ -405,10 +405,16 @@ proxy_free(proxy_ctx_t *ctx) proxy_listener_ctx_free(ctx->lctx); } for (size_t i = 0; i < (sizeof(ctx->sev) / sizeof(ctx->sev[0])); i++) { - event_free(ctx->sev[i]); + if (ctx->sev[i]) { + event_free(ctx->sev[i]); + } + } + if (ctx->thrmgr) { + pxy_thrmgr_free(ctx->thrmgr); + } + if (ctx->evbase) { + event_base_free(ctx->evbase); } - pxy_thrmgr_free(ctx->thrmgr); - event_base_free(ctx->evbase); free(ctx); } diff --git a/pxythrmgr.c b/pxythrmgr.c index f55f7cb..a56c83c 100644 --- a/pxythrmgr.c +++ b/pxythrmgr.c @@ -176,9 +176,10 @@ leave: idx--; } pthread_mutex_destroy(&ctx->mutex); - if (ctx->thr) + if (ctx->thr) { free(ctx->thr); - free(ctx); + ctx->thr = NULL; + } return -1; } @@ -188,20 +189,24 @@ leave: void pxy_thrmgr_free(pxy_thrmgr_ctx_t *ctx) { + if (!ctx) + return; pthread_mutex_destroy(&ctx->mutex); - for (int idx = 0; idx < ctx->num_thr; idx++) { - event_base_loopbreak(ctx->thr[idx]->evbase); - sched_yield(); - } - for (int idx = 0; idx < ctx->num_thr; idx++) { - pthread_join(ctx->thr[idx]->thr, NULL); - } - for (int idx = 0; idx < ctx->num_thr; idx++) { - evdns_base_free(ctx->thr[idx]->dnsbase, 0); - event_base_free(ctx->thr[idx]->evbase); - free(ctx->thr[idx]); + if (ctx->thr) { + for (int idx = 0; idx < ctx->num_thr; idx++) { + event_base_loopbreak(ctx->thr[idx]->evbase); + sched_yield(); + } + for (int idx = 0; idx < ctx->num_thr; idx++) { + pthread_join(ctx->thr[idx]->thr, NULL); + } + for (int idx = 0; idx < ctx->num_thr; idx++) { + evdns_base_free(ctx->thr[idx]->dnsbase, 0); + event_base_free(ctx->thr[idx]->evbase); + free(ctx->thr[idx]); + } + free(ctx->thr); } - free(ctx->thr); free(ctx); }