Fix menuitem memory leaks

This commit is contained in:
GenericHeroGuy 2025-06-22 01:02:23 +02:00
parent b7bdd2ff6f
commit 83cfe66219
3 changed files with 20 additions and 22 deletions

View file

@ -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"))

View file

@ -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
{

View file

@ -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