From 83cfe662197c891915f330aa7a084e799a19125b Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Sun, 22 Jun 2025 01:02:23 +0200 Subject: [PATCH] Fix menuitem memory leaks --- src/deh_soc.c | 8 ++++++++ src/m_menu.c | 32 +++++++++++--------------------- src/m_menu.h | 2 +- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 7e885ab42..bd2638811 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1977,14 +1977,20 @@ static void readmenuitem(MYFILE *f, menuitem_t *menuitem) } else if (fastcmp(word, "TEXT")) { + if (menuitem->text) + Z_Free(menuitem->text); menuitem->text = Z_StrDup(word2); } else if (fastcmp(word, "PATCH")) { + if (menuitem->patch) + Z_Free(menuitem->patch); menuitem->patch = Z_StrDup(word2); } else if (fastcmp(word, "TOOLTIP")) { + if (menuitem->tooltip) + Z_Free(menuitem->tooltip); menuitem->tooltip = Z_StrDup(word2); } else if (fastcmp(word, "STYLE")) @@ -2271,6 +2277,8 @@ void readmenu(MYFILE *f, INT32 num) // MENUDEF STARTS HERE else if (fastcmp(word, "HEADERPIC")) { + if (menudef->headerpic) + Z_Free(menudef->headerpic); menudef->headerpic = Z_StrDup(word2); } else if (fastcmp(word, "DRAWROUTINE")) diff --git a/src/m_menu.c b/src/m_menu.c index c7c0c78a2..8f1365de6 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -266,7 +266,6 @@ static INT16 M_GetMenuIndex(menutype_t type, const char *name) #define M_SetItemArgument(t, n, v) (M_GetMenuItem(t, n)->argument = v) #define M_SetItemX(t, n, v) (M_GetMenuItem(t, n)->x = v) #define M_SetItemY(t, n, v) (M_GetMenuItem(t, n)->y = v) -#define M_SetItemText(t, n, s) (M_GetMenuItem(t, n)->text = s) #define M_GetItemX(t, n) (M_GetMenuItem(t, n)->x) #define M_GetItemY(t, n) (M_GetMenuItem(t, n)->y) @@ -278,6 +277,14 @@ static void M_ChangeItemStatus(menutype_t type, const char *name, menuitemflags_ M_GetMenuItem(type, name)->status &= ~flag; } +static void M_SetItemText(menutype_t type, const char *name, const char *string) +{ + menuitem_t *item = M_GetMenuItem(type, name); + if (item->text) + Z_Free(item->text); + item->text = Z_StrDup(string); +} + #define M_SetItemVisible(t, n, c) M_ChangeItemStatus(t, n, IT_HIDDEN, !(c)) #define M_SetItemDisabled(t, n, c) M_ChangeItemStatus(t, n, IT_GRAYEDOUT, c) #define M_SetItemSecret(t, n, c) M_ChangeItemStatus(t, n, IT_SECRET, c) @@ -8000,10 +8007,6 @@ INT32 MR_HandleMonitorToggles(INT32 choice) return true; } -static char *serveraddon = NULL; -static char *serverping = NULL; -static char *servergametype = NULL; - INT32 MR_EnterViewServer(INT32 choice) { (void)choice; @@ -8013,16 +8016,6 @@ INT32 MR_EnterViewServer(INT32 choice) UINT32 ping = serverlist[joinnode].info.time; UINT8 kartvars = serverlist[joinnode].info.kartvars; - if (serveraddon) - Z_Free(serveraddon); - if (serverping) - Z_Free(serverping); - if (servergametype) - Z_Free(servergametype); - - serveraddon = zva(PU_STATIC, NULL, "\x82%d Addon%s", fileneedednum, fileneedednum > 1 ? "s" : ""); - serverping = zva(PU_STATIC, NULL, "Ping: %c%ums", (ping < 128 ? '\x83' : (ping < 256 ? '\x82' : '\x85')), ping); - switch (kartvars & SV_SPEEDMASK) { case KARTSPEED_EASY: @@ -8036,18 +8029,15 @@ INT32 MR_EnterViewServer(INT32 choice) break; } - servergametype = zva(PU_STATIC, NULL, "%s: %s", serverlist[joinnode].info.gametypename, speedstring); - - M_SetItemArgument(MN_VIEWSERVER, "THUMBNAIL", G_LevelTitleToMapNum(serverlist[joinnode].info.maptitle)); M_SetItemText(MN_VIEWSERVER, "SERVERNAME", servername); - M_SetItemText(MN_VIEWSERVER, "SERVERPING", serverping); + M_SetItemText(MN_VIEWSERVER, "SERVERPING", va("Ping: %c%ums", ping < 128 ? '\x83' : ping < 256 ? '\x82' : '\x85', ping)); M_SetItemText(MN_VIEWSERVER, "SERVERMAP", servermap); - M_SetItemText(MN_VIEWSERVER, "SERVERGAMETYPE", servergametype); + M_SetItemText(MN_VIEWSERVER, "SERVERGAMETYPE", va("%s: %s", serverlist[joinnode].info.gametypename, speedstring)); if (fileneedednum > 0) { - M_SetItemText(MN_VIEWSERVER, "SERVERADDON", serveraddon); + M_SetItemText(MN_VIEWSERVER, "SERVERADDON", va("\x82%d Addon%s", fileneedednum, fileneedednum > 1 ? "s" : "")); } else { diff --git a/src/m_menu.h b/src/m_menu.h index 3f2f7d9b4..8a80a3f55 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -187,7 +187,7 @@ struct menuitem_t struct menu_t { dehinfo_t info; - const char *headerpic; + char *headerpic; INT16 numitems; // # of menu items menuitem_t *menuitems; // menu items menudrawer_f *drawroutine; // draw routine