stale lock picking context
Lock context wasn't being cleared if it was for a container and that container got destroyed. Case discovered was forcelock() -> breakchestlock() -> delobj() (sometimes the container is destroyed rather than just breaking its lock) followed by #wizmakemap (replace current level) and maybe_reset_pick() trying to check whether xlock.box was being carried. But being interrupted, destroying the container or dropping it down a hole to ship it to another level, then attempting to resume picking the lock would also find a stale pointer.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.6 mkobj.c $NHDT-Date: 1547086532 2019/01/10 02:15:32 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.141 $ */
|
||||
/* NetHack 3.6 mkobj.c $NHDT-Date: 1548978605 2019/01/31 23:50:05 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.142 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/*-Copyright (c) Derek S. Ray, 2015. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -2076,6 +2076,10 @@ struct obj *obj;
|
||||
if (obj->where != OBJ_FREE)
|
||||
panic("add_to_migration: obj not free");
|
||||
|
||||
/* lock picking context becomes stale if it's for this object */
|
||||
if (Is_container(obj))
|
||||
maybe_reset_pick(obj);
|
||||
|
||||
obj->where = OBJ_MIGRATING;
|
||||
obj->nobj = migrating_objs;
|
||||
migrating_objs = obj;
|
||||
|
||||
Reference in New Issue
Block a user