diff --git a/src/mkobj.c b/src/mkobj.c index 3bcdb26b9..2d3826331 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -97,11 +97,11 @@ dealloc_oextra(struct obj *o) if (x) { if (x->oname) - free((genericptr_t) x->oname); + free((genericptr_t) x->oname), x->oname = 0; if (x->omonst) - free_omonst(o); /* 'o' rather than 'x' */ + free_omonst(o); /* note: pass 'o' rather than 'x' */ if (x->omailcmd) - free((genericptr_t) x->omailcmd); + free((genericptr_t) x->omailcmd), x->omailcmd = 0; free((genericptr_t) x); o->oextra = (struct oextra *) 0; @@ -2635,12 +2635,13 @@ dealloc_obj(struct obj *obj) obj->where = OBJ_LUAFREE; return; } -#ifdef DEBUG - /* clobber out of date information contained in the about-to-become - stale memory; do this before 'free()' in case a debugging malloc - implementation overwrites the memory with something else */ + + /* clear out of date information contained in the about-to-become + stale memory so that potential used-after-freed bugs (should never + happen) might trigger an object lost panic instead of continuing; + linking with a debugging malloc library is likely to do something + similar so this is mainly useful for ordinary malloc/free */ *obj = cg.zeroobj; -#endif free((genericptr_t) obj); } diff --git a/src/mon.c b/src/mon.c index 89ae78b82..3cb60b975 100644 --- a/src/mon.c +++ b/src/mon.c @@ -2364,18 +2364,18 @@ dealloc_mextra(struct monst* m) if (x) { if (x->mgivenname) - free((genericptr_t) x->mgivenname); + free((genericptr_t) x->mgivenname), x->mgivenname = 0; if (x->egd) - free((genericptr_t) x->egd); + free((genericptr_t) x->egd), x->egd = 0; if (x->epri) - free((genericptr_t) x->epri); + free((genericptr_t) x->epri), x->epri = 0; if (x->eshk) - free((genericptr_t) x->eshk); + free((genericptr_t) x->eshk), x->eshk = 0; if (x->emin) - free((genericptr_t) x->emin); + free((genericptr_t) x->emin), x->emin = 0; if (x->edog) - free((genericptr_t) x->edog); - /* [no action needed for x->mcorpsenm] */ + free((genericptr_t) x->edog), x->edog = 0; + x->mcorpsenm = NON_PM; /* no allocation to release */ free((genericptr_t) x); m->mextra = (struct mextra *) 0; @@ -2394,6 +2394,9 @@ dealloc_monst(struct monst *mon) } if (mon->mextra) dealloc_mextra(mon); + /* clear out of date information contained in the about-to-become + stale memory; see dealloc_obj() */ + *mon = cg.zeromonst; free((genericptr_t) mon); }