diff --git a/client/include/interface/overlay.h b/client/include/interface/overlay.h index 5a0f9664..2bd8465e 100644 --- a/client/include/interface/overlay.h +++ b/client/include/interface/overlay.h @@ -38,7 +38,7 @@ struct LG_OverlayOps /* called when the overlay is registered */ bool (*init)(void ** udata, const void * params); - /* final free */ + /* final free; must be safe if init was not called or returned false */ void (*free)(void * udata); /* return true if realtime rendering is required diff --git a/client/src/app.c b/client/src/app.c index f18bc947..f8509fdf 100644 --- a/client/src/app.c +++ b/client/src/app.c @@ -858,8 +858,6 @@ void app_registerOverlay(const struct LG_OverlayOps * ops, const void * params) ops->earlyInit(); } -static bool l_overlaysInitialized = false; - void app_initOverlays(void) { struct Overlay * overlay; @@ -870,12 +868,12 @@ void app_initOverlays(void) if (!overlay->ops->init(&overlay->udata, overlay->params)) { DEBUG_ERROR("Overlay `%s` failed to initialize", overlay->ops->name); + overlay->ops->free(overlay->udata); ll_removeNL(g_state.overlays, item); free(item); free(overlay); } } - l_overlaysInitialized = true; ll_unlock(g_state.overlays); /* Do not seed ImGui's clock with absolute host uptime. ImGui stores the @@ -1071,11 +1069,9 @@ void app_freeOverlays(void) struct Overlay * overlay; while(ll_shift(g_state.overlays, (void **)&overlay)) { - if (l_overlaysInitialized) - overlay->ops->free(overlay->udata); + overlay->ops->free(overlay->udata); free(overlay); } - l_overlaysInitialized = false; } void app_setOverlay(bool enable) diff --git a/client/src/overlay/config.c b/client/src/overlay/config.c index 9b5a4d1a..3389907d 100644 --- a/client/src/overlay/config.c +++ b/client/src/overlay/config.c @@ -60,6 +60,9 @@ static bool config_init(void ** udata, const void * params) static void config_freeList(struct ll * list) { + if (!list) + return; + ConfigCallback * cb; while(ll_shift(list, (void **)&cb)) { @@ -73,6 +76,8 @@ static void config_free(void * udata) { config_freeList(cfg.callbacks); config_freeList(cfg.tabCallbacks); + cfg.callbacks = NULL; + cfg.tabCallbacks = NULL; } static void config_renderLGTab(void) diff --git a/client/src/overlay/graphs.c b/client/src/overlay/graphs.c index e35b4a35..8b5992b9 100644 --- a/client/src/overlay/graphs.c +++ b/client/src/overlay/graphs.c @@ -168,16 +168,26 @@ static bool graphs_init(void ** udata, const void * params) static void graphs_free(void * udata) { - struct OverlayGraph * graph; - while(ll_shift(gs.graphs, (void **)&graph)) - graphFree(graph); - ll_free(gs.graphs); - gs.graphs = NULL; + if (gs.graphs) + { + struct OverlayGraph * graph; + while(ll_shift(gs.graphs, (void **)&graph)) + graphFree(graph); + ll_free(gs.graphs); + gs.graphs = NULL; + } - ImPlotSpec_destroy(gs.plotSpec); - gs.plotSpec = NULL; - ImPlot_DestroyContext(gs.plotContext); - gs.plotContext = NULL; + if (gs.plotSpec) + { + ImPlotSpec_destroy(gs.plotSpec); + gs.plotSpec = NULL; + } + + if (gs.plotContext) + { + ImPlot_DestroyContext(gs.plotContext); + gs.plotContext = NULL; + } } struct BufferMetrics diff --git a/client/src/overlay/msg.c b/client/src/overlay/msg.c index 539b96f1..892e24dd 100644 --- a/client/src/overlay/msg.c +++ b/client/src/overlay/msg.c @@ -75,10 +75,15 @@ static void freeMsg(struct Msg * msg) static void msg_free(void * udata) { - struct Msg * msg; - while(ll_shift(l_msg.messages, (void **)&msg)) - freeMsg(msg); - ll_free(l_msg.messages); + if (l_msg.messages) + { + struct Msg * msg; + while(ll_shift(l_msg.messages, (void **)&msg)) + freeMsg(msg); + ll_free(l_msg.messages); + l_msg.messages = NULL; + } + l_msg.initialized = false; } diff --git a/client/src/overlay/splash.c b/client/src/overlay/splash.c index 965d5bb0..ad71fef1 100644 --- a/client/src/overlay/splash.c +++ b/client/src/overlay/splash.c @@ -124,7 +124,7 @@ static bool splash_init(void ** udata, const void * params) static void splash_free(void * udata) { overlayFreeImage(&l_logo); - stringlist_free(&l_tagline ); + stringlist_free(&l_tagline); stringlist_free(&l_footline); } diff --git a/common/src/stringlist.c b/common/src/stringlist.c index f9483bb8..9b0343ac 100644 --- a/common/src/stringlist.c +++ b/common/src/stringlist.c @@ -51,6 +51,9 @@ StringList stringlist_new(bool owns_strings) void stringlist_free(StringList * sl) { + if (!sl || !*sl) + return; + stringlist_clear(*sl); vector_destroy(&(*sl)->vector);