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.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user