minor memory leak in mdlib opttext[]

opttext[] was given 120 elements but the MAXOPT macro used to limit
populating it was only 40.  There happen to be exactly 40 lines of
runtime info--at least for my config--and the last slot was going to
waste, so the final dupstr("") at the end of build_options() wasn't
being tracked and freed.

It's interesting the whatever other memory checker is being used
failed to find something caught by old heaputil.  Maybe the configs
running whatever it is are generating smaller options text?
This commit is contained in:
PatR
2023-12-07 04:05:26 -08:00
parent 6e2fa24344
commit 5c5a5cf2cc
+17 -16
View File
@@ -93,8 +93,8 @@ static void opt_out_words(char *, int *);
static void build_savebones_compat_string(void); static void build_savebones_compat_string(void);
static int idxopttext, done_runtime_opt_init_once = 0; static int idxopttext, done_runtime_opt_init_once = 0;
#define MAXOPT 40 #define MAXOPT 60 /* 3.7: currently 40 lines get inserted into opttext[] */
static char *opttext[120] = { 0 }; static char *opttext[MAXOPT] = { 0 };
char optbuf[COLBUFSZ]; char optbuf[COLBUFSZ];
static struct version_info version; static struct version_info version;
static const char opt_indent[] = " "; static const char opt_indent[] = " ";
@@ -736,7 +736,7 @@ opt_out_words(
*word = '\0'; *word = '\0';
if (*length_p + (int) strlen(str) > COLNO - 5) { if (*length_p + (int) strlen(str) > COLNO - 5) {
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
Sprintf(optbuf, "%s", opt_indent), Sprintf(optbuf, "%s", opt_indent),
*length_p = (int) strlen(opt_indent); *length_p = (int) strlen(opt_indent);
@@ -763,7 +763,7 @@ build_options(void)
#endif #endif
build_savebones_compat_string(); build_savebones_compat_string();
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
#if (NH_DEVEL_STATUS != NH_STATUS_RELEASED) #if (NH_DEVEL_STATUS != NH_STATUS_RELEASED)
#if (NH_DEVEL_STATUS == NH_STATUS_BETA) #if (NH_DEVEL_STATUS == NH_STATUS_BETA)
@@ -777,11 +777,11 @@ build_options(void)
Sprintf(optbuf, "%sNetHack version %d.%d.%d%s\n", Sprintf(optbuf, "%sNetHack version %d.%d.%d%s\n",
opt_indent, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, STATUS_ARG); opt_indent, VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL, STATUS_ARG);
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
Sprintf(optbuf, "Options compiled into this edition:"); Sprintf(optbuf, "Options compiled into this edition:");
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
length = COLNO + 1; /* force 1st item onto new line */ length = COLNO + 1; /* force 1st item onto new line */
@@ -799,17 +799,17 @@ build_options(void)
opt_out_words(buf, &length); opt_out_words(buf, &length);
} }
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
winsyscnt = count_and_validate_winopts(); winsyscnt = count_and_validate_winopts();
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
Sprintf(optbuf, "Supported windowing system%s:", Sprintf(optbuf, "Supported windowing system%s:",
(winsyscnt > 1) ? "s" : ""); (winsyscnt > 1) ? "s" : "");
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
length = COLNO + 1; /* force 1st item onto new line */ length = COLNO + 1; /* force 1st item onto new line */
@@ -843,17 +843,17 @@ build_options(void)
#if !defined(MAKEDEFS_C) #if !defined(MAKEDEFS_C)
cnt = 0; cnt = 0;
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
soundlibcnt = count_and_validate_soundlibopts(); soundlibcnt = count_and_validate_soundlibopts();
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
Sprintf(optbuf, "Supported soundlib%s:", Sprintf(optbuf, "Supported soundlib%s:",
(soundlibcnt > 1) ? "s" : ""); (soundlibcnt > 1) ? "s" : "");
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
length = COLNO + 1; /* force 1st item onto new line */ length = COLNO + 1; /* force 1st item onto new line */
@@ -893,7 +893,7 @@ build_options(void)
#endif /* !MAKEDEFS_C */ #endif /* !MAKEDEFS_C */
opttext[idxopttext] = dupstr(optbuf); opttext[idxopttext] = dupstr(optbuf);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
optbuf[0] = '\0'; optbuf[0] = '\0';
@@ -921,7 +921,7 @@ build_options(void)
":TAG:" substitutions are deferred to caller */ ":TAG:" substitutions are deferred to caller */
for (i = 0; lua_info[i]; ++i) { for (i = 0; lua_info[i]; ++i) {
opttext[idxopttext] = dupstr(lua_info[i]); opttext[idxopttext] = dupstr(lua_info[i]);
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
} }
} }
@@ -929,8 +929,9 @@ build_options(void)
/* end with a blank line */ /* end with a blank line */
opttext[idxopttext] = dupstr(""); opttext[idxopttext] = dupstr("");
if (idxopttext < (MAXOPT - 1)) if (idxopttext < MAXOPT)
idxopttext++; idxopttext++;
opttext[MAXOPT - 1] = NULL;
return; return;
} }
@@ -974,7 +975,7 @@ do_runtime_info(int *rtcontext)
if (!done_runtime_opt_init_once) if (!done_runtime_opt_init_once)
runtime_info_init(); runtime_info_init();
if (idxopttext && rtcontext) if (idxopttext && rtcontext)
if (*rtcontext >= 0 && *rtcontext < (MAXOPT - 1)) { if (*rtcontext >= 0 && *rtcontext < MAXOPT) {
retval = opttext[*rtcontext]; retval = opttext[*rtcontext];
*rtcontext += 1; *rtcontext += 1;
} }