fix issue #1436 - object_from_map() vs Hallu

Issue reported by janne-hmp:  examining an object on the map while
halluicinating might operate on an object whose name is Null since the
random object could be one that holds an extra description for item
shuffling at game start.  Attempting to format the object led to a
crash.

I wasn't able to reproduce the crash, possibly because MacOS produces
the string "(null)" for sprintf("%s",NULL) instead of dereferencing
the Null pointer.

Perhaps random object selection for display should reject the extra
description objects in some classes.  This susbstitutes a different
object if examining the map encounters one of those.

Fixes #1436
This commit is contained in:
PatR
2025-08-10 12:45:29 -07:00
parent 4bde4b439d
commit 407a2e0ea8
2 changed files with 17 additions and 1 deletions

View File

@@ -312,7 +312,20 @@ object_from_map(
if (!otmp || otmp->otyp != glyphotyp) {
/* this used to exclude STRANGE_OBJECT; now caller deals with it */
otmp = mksobj(glyphotyp, FALSE, FALSE);
if (OBJ_NAME(objects[glyphotyp])) {
/* map shows a regular object, but one that's not actually here */
otmp = mksobj(glyphotyp, FALSE, FALSE);
} else {
/* map shows a non-item that holds an extra object type (shown
on map due to hallucination) for a name which might have been
shuffled into play but wasn't (or was shuffled out of play);
pick another item that is a regular one in same object class */
otmp = mkobj(objects[glyphotyp].oc_class, FALSE);
/* mkobj() doesn't provide any no-init option; however, there
aren't any extra tool items (or statues) so we won't get here
for tools and don't need to check for and delete container
contents or extinguish lights on the temporary object */
}
/* even though we pass False for mksobj()'s 'init' arg, corpse-rot,
egg-hatch, and figurine-transform timers get initialized */
if (otmp->timed)