From 16f4bdb5a6e6518a9ad3b0685c2925d36923f545 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 1 Feb 2024 14:25:23 -0800 Subject: [PATCH] Revert "fix crash on NULL gi.invent" This reverts commit 378648bd9c1e851477d05471f2194d55ee40096c. The problem was triggered by marking the 'objlist' argument in merge_choice() prototype with __attribute__((nonnull)) when it shouldn't have been, then a followup which relied on that. The 'objlist' argument might be Null. Instead of passing its address to force it to be non-Null, remove the attribute. --- include/extern.h | 2 +- src/files.c | 2 +- src/invent.c | 44 +++++++++++++++++++++----------------------- src/pickup.c | 4 ++-- src/shk.c | 2 +- src/uhitm.c | 2 +- 6 files changed, 27 insertions(+), 29 deletions(-) diff --git a/include/extern.h b/include/extern.h index 34e9fe65c..8a8bfce3f 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1239,7 +1239,7 @@ extern Loot *sortloot(struct obj **, unsigned, boolean, boolean(*)(struct obj *)) NONNULLARG1; extern void unsortloot(Loot **) NONNULLARG1; extern void assigninvlet(struct obj *) NONNULLARG1; -extern struct obj *merge_choice(struct obj **, struct obj *) NONNULLPTRS; +extern struct obj *merge_choice(struct obj *, struct obj *) NONNULLPTRS; extern int merged(struct obj **, struct obj **) NONNULLPTRS; extern void addinv_core1(struct obj *) NONNULLARG1; extern void addinv_core2(struct obj *) NONNULLARG1; diff --git a/src/files.c b/src/files.c index 09e1a1039..c3956deaa 100644 --- a/src/files.c +++ b/src/files.c @@ -3885,7 +3885,7 @@ wizkit_addinv(struct obj *obj) obj->bknown = 1; /* ok to bypass set_bknown() */ /* same criteria as lift_object()'s check for available inventory slot */ if (obj->oclass != COIN_CLASS && inv_cnt(FALSE) >= invlet_basic - && !merge_choice(&gi.invent, obj)) { + && !merge_choice(gi.invent, obj)) { /* inventory overflow; can't just place & stack object since hero isn't in position yet, so schedule for arrival later */ add_to_migration(obj); diff --git a/src/invent.c b/src/invent.c index 454573410..20a7cf645 100644 --- a/src/invent.c +++ b/src/invent.c @@ -781,11 +781,10 @@ reorder_invent(void) one of them; used in pickup.c when all 52 inventory slots are in use, to figure out whether another object could still be picked up */ struct obj * -merge_choice(struct obj **objlist, struct obj *obj) +merge_choice(struct obj *objlist, struct obj *obj) { struct monst *shkp; unsigned save_nocharge; - struct obj *olist = *objlist; if (obj->otyp == SCR_SCARE_MONSTER) /* punt on these */ return (struct obj *) 0; @@ -793,29 +792,28 @@ merge_choice(struct obj **objlist, struct obj *obj) have when carried are different from what they are now; prevent that from eliciting an incorrect result from mergable() */ save_nocharge = obj->no_charge; - if (olist) { - if (olist == gi.invent && obj->where == OBJ_FLOOR - && (shkp = shop_keeper(inside_shop(obj->ox, obj->oy))) != 0) { - if (obj->no_charge) - obj->no_charge = 0; - /* A billable object won't have its `unpaid' bit set, so would - erroneously seem to be a candidate to merge with a similar - ordinary object. That's no good, because once it's really - picked up, it won't merge after all. It might merge with - another unpaid object, but we can't check that here (depends - too much upon shk's bill) and if it doesn't merge it would - end up in the '#' overflow inventory slot, so reject it now. */ - else if (inhishop(shkp)) - return (struct obj *) 0; - } - do { - if (mergable(olist, obj)) - break; - olist = olist->nobj; - } while (olist); + if (objlist == gi.invent && obj->where == OBJ_FLOOR + && (shkp = shop_keeper(inside_shop(obj->ox, obj->oy))) != 0) { + if (obj->no_charge) + obj->no_charge = 0; + /* A billable object won't have its `unpaid' bit set, so would + erroneously seem to be a candidate to merge with a similar + ordinary object. That's no good, because once it's really + picked up, it won't merge after all. It might merge with + another unpaid object, but we can't check that here (depends + too much upon shk's bill) and if it doesn't merge it would + end up in the '#' overflow inventory slot, so reject it now. */ + else if (inhishop(shkp)) + return (struct obj *) 0; } + do { + /*assert(objlist != NULL);*/ + if (mergable(objlist, obj)) + break; + objlist = objlist->nobj; + } while (objlist); obj->no_charge = save_nocharge; - return olist; + return objlist; } /* merge obj with otmp and delete obj if types agree */ diff --git a/src/pickup.c b/src/pickup.c index bd155f4fb..33af16001 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -1699,7 +1699,7 @@ lift_object( if (obj->otyp == LOADSTONE || (obj->otyp == BOULDER && throws_rocks(gy.youmonst.data))) { if (inv_cnt(FALSE) < invlet_basic || !carrying(obj->otyp) - || merge_choice(&gi.invent, obj)) + || merge_choice(gi.invent, obj)) return 1; /* lift regardless of current situation */ /* if we reach here, we're out of slots and already have at least one of these, so treat this one more like a normal item @@ -1719,7 +1719,7 @@ lift_object( /* [exception for gold coins will have to change if silver/copper ones ever get implemented] */ && inv_cnt(FALSE) >= invlet_basic - && !merge_choice(&gi.invent, obj)) { + && !merge_choice(gi.invent, obj)) { /* if there is some gold here (and we haven't already skipped it), we aren't limited by the 52 item limit for it, but caller and "grandcaller" aren't prepared to skip stuff and then pickup diff --git a/src/shk.c b/src/shk.c index c227a6dc2..a2dc796aa 100644 --- a/src/shk.c +++ b/src/shk.c @@ -152,7 +152,7 @@ money2u(struct monst* mon, long amount) mongold = splitobj(mongold, amount); obj_extract_self(mongold); - if (!merge_choice(&gi.invent, mongold) + if (!merge_choice(gi.invent, mongold) && inv_cnt(FALSE) >= invlet_basic) { You("have no room for the gold!"); dropy(mongold); diff --git a/src/uhitm.c b/src/uhitm.c index fb03df597..c233e088b 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -2717,7 +2717,7 @@ mhitm_ad_sgld( if (mongold) { obj_extract_self(mongold); - if (merge_choice(&gi.invent, mongold) + if (merge_choice(gi.invent, mongold) || inv_cnt(FALSE) < invlet_basic) { addinv(mongold); Your("purse feels heavier.");