From f1ba320cb3ce34327ac10a8070a29faac0ee98e1 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 17 Apr 2025 10:06:46 -0700 Subject: [PATCH] memory tracking fix 'heaputil' is producing a lot of complaints. This fixes one of them, about freeing memory that was never allocated. In this case, it's when removing an overview annotation for a level. The annotation is using dupstr_n() and not being recorded due to dupstr_n() being placed after MONITOR_HEAP undefines the macro that overrides alloc(). There's only one use of dupstr_n(), and its length checking isn't needed there, so just switch to dupstr() and comment out the implementation of dupstr_n(). I left the prototype in extern.h; that's harmless. If dupstr_n() needs to be resurrected, a second MONITOR_HEAP-aware version should be implemented, with corresponding macro to choose which one to use. --- src/alloc.c | 4 +++- src/dungeon.c | 17 ++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 158d03a55..05dfb502f 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -246,6 +246,8 @@ dupstr(const char *string) return strcpy((char *) alloc(len + 1), string); } +#if 0 /* suppress this; if included, it will need a MONITOR_HEAP edition */ + /* similar for reasonable size strings, but return length of input as well */ char * dupstr_n(const char *string, unsigned int *lenout) @@ -257,7 +259,7 @@ dupstr_n(const char *string, unsigned int *lenout) *lenout = (unsigned int) len; return strcpy((char *) alloc(len + 1), string); } - +#endif /* cast to int or panic on overflow; use via macro */ int diff --git a/src/dungeon.c b/src/dungeon.c index f05c926ab..aac8266a8 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -2554,7 +2554,9 @@ query_annotation(d_level *lev) /* add new annotation, unless it's all spaces (which will be an empty string after mungspaces() above) */ if (*nbuf && strcmp(nbuf, " ")) { - mptr->custom = dupstr_n(nbuf,&mptr->custom_lth); + mptr->custom = dupstr(nbuf); + /* _lth field does not include trailing '\0' in the count */ + mptr->custom_lth = (unsigned) strlen(mptr->custom); } } @@ -2668,27 +2670,24 @@ rm_mapseen(int ledger_num) if (svd.dungeons[mptr->lev.dnum].ledger_start + mptr->lev.dlevel == ledger_num) break; - if (!mptr) return; if (mptr->custom) - free((genericptr_t) mptr->custom); + free((genericptr_t) mptr->custom), mptr->custom = (char *) NULL; - bp = mptr->final_resting_place; - while (bp) { + bpnext = mptr->final_resting_place; + while ((bp = bpnext) != NULL) { bpnext = bp->next; - free(bp); - bp = bpnext; + free((genericptr_t) bp); } if (mprev) { mprev->next = mptr->next; - free(mptr); } else { svm.mapseenchn = mptr->next; - free(mptr); } + free(mptr); } staticfn void