diff --git a/include/global.h b/include/global.h index f7514f44f..3eb12b86c 100644 --- a/include/global.h +++ b/include/global.h @@ -297,6 +297,7 @@ typedef char nhptext; #ifdef MONITOR_HEAP extern long *FDECL(nhalloc, (unsigned int,const char *,int)); extern void FDECL(nhfree, (genericptr_t,const char *,int)); +extern char *FDECL(nhdupstr, (const char *,const char *,int)); # ifndef __FILE__ # define __FILE__ "" # endif @@ -305,8 +306,10 @@ extern void FDECL(nhfree, (genericptr_t,const char *,int)); # endif # define alloc(a) nhalloc(a,__FILE__,(int)__LINE__) # define free(a) nhfree(a,__FILE__,(int)__LINE__) +# define dupstr(s) nhdupstr(s,__FILE__,(int)__LINE__) #else /* !MONITOR_HEAP */ extern long *FDECL(alloc, (unsigned int)); /* alloc.c */ +extern char *FDECL(dupstr, (const char *)); /* ditto */ #endif /* Used for consistency checks of various data files; declare it here so diff --git a/src/alloc.c b/src/alloc.c index 54ad080ec..08066565b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1,5 +1,4 @@ /* NetHack 3.5 alloc.c $Date$ $Revision$ */ -/* SCCS Id: @(#)alloc.c 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -135,6 +134,28 @@ int line; free(ptr); } +/* strdup() which uses our alloc() rather than libc's malloc(), + with caller tracking */ +char * +nhdupstr(string, file, line) +const char *string; +const char *file; +int line; +{ + return strcpy((char *)nhalloc(strlen(string) + 1, file, line), string); +} +#undef dupstr + #endif /* MONITOR_HEAP */ +/* strdup() which uses our alloc() rather than libc's malloc(); + not used when MONITOR_HEAP is enabled, but included unconditionally + in case utility programs get built using a different setting for that */ +char * +dupstr(string) +const char *string; +{ + return strcpy((char *)alloc(strlen(string) + 1), string); +} + /*alloc.c*/ diff --git a/src/do.c b/src/do.c index d8699db82..4681760f8 100644 --- a/src/do.c +++ b/src/do.c @@ -1444,9 +1444,9 @@ const char *pre_msg, *post_msg; assign_level(&u.utolev, tolev); if (pre_msg) - dfr_pre_msg = strcpy((char *)alloc(strlen(pre_msg) + 1), pre_msg); + dfr_pre_msg = dupstr(pre_msg); if (post_msg) - dfr_post_msg = strcpy((char *)alloc(strlen(post_msg)+1), post_msg); + dfr_post_msg = dupstr(post_msg); } /* handle something like portal ejection */ @@ -1572,7 +1572,7 @@ struct obj *corpse; void revive_mon(arg, timeout) anything *arg; -long timeout; +long timeout UNUSED; { struct obj *body = arg->a_obj; struct permonst *mptr = &mons[body->corpsenm]; diff --git a/src/do_name.c b/src/do_name.c index eb234ce94..9d19a1997 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -602,7 +602,7 @@ register struct obj *obj; undiscover_object(obj->otyp); } } else { - *str1 = strcpy((char *) alloc((unsigned)strlen(buf)+1), buf); + *str1 = dupstr(buf); discover_object(obj->otyp, FALSE, TRUE); /* possibly add to disco[] */ } } diff --git a/src/eat.c b/src/eat.c index 58eafcd2c..90efd5638 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1025,7 +1025,7 @@ register int pm; "You suddenly dread being peeled and mimic %s again!" : "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); - eatmbuf = strcpy((char *) alloc(strlen(buf) + 1), buf); + eatmbuf = dupstr(buf); nomovemsg = eatmbuf; afternmv = eatmdone; /* ??? what if this was set before? */