From 3eb452ad946fe7e759f2a7e25bbc3145a1f878f1 Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 14 Jun 2018 17:29:59 -0700 Subject: [PATCH] another sortloot tweak The code that formats an object for use in alphabetic comparisons during sorting is forcing off wizard mode to avoid any alternate formatting that might produce. Add a guarantee that doing this can't be used as a backdoor to create a normal mode panic file if someone figures out a way to make xname() panic. --- src/invent.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/invent.c b/src/invent.c index 87a000228..9a66d0883 100644 --- a/src/invent.c +++ b/src/invent.c @@ -214,11 +214,20 @@ struct obj *obj; /* suppress user-assigned name */ if (save_oname && !obj->oartifact) ONAME(obj) = 0; - flags.debug = FALSE; /* avoid wizard mode formatting variations */ + /* avoid wizard mode formatting variations */ + if (wizard) { /* flags.debug */ + /* paranoia: before toggling off wizard mode, guard against a + panic in xname() producing a normal mode panic save file */ + program_state.something_worth_saving = 0; + flags.debug = FALSE; + } res = cxname_singular(obj); - flags.debug = save_debug; + if (save_debug) { + flags.debug = TRUE; + program_state.something_worth_saving = 1; + } /* restore the object */ if (obj->oclass == POTION_CLASS) { obj->odiluted = saveo.odiluted; @@ -409,7 +418,7 @@ tiebreak: * whether the list was already sorted as it got ready to do the * sorting, so re-examining inventory or a pile of objects without * having changed anything would gobble up less CPU than a full - * sort. But it had as least two problems (aside from the ordinary + * sort. But it had at least two problems (aside from the ordinary * complement of bugs): * 1) some players wanted to get the original order back when they * changed the 'sortloot' option back to 'none', but the list @@ -449,10 +458,15 @@ boolean FDECL((*filterfunc), (OBJ_P)); /* note: if there is a filter function, this might overallocate */ sliarray = (Loot *) alloc((n + 1) * sizeof *sliarray); + /* the 'keep cockatrice corpses' flag is overloaded with sort mode */ augment_filter = (mode & SORTLOOT_PETRIFY) ? TRUE : FALSE; + mode &= ~SORTLOOT_PETRIFY; /* remove flag, leaving mode */ /* populate aliarray[0..n-1] */ for (i = 0, o = *olist; o; ++i, o = by_nexthere ? o->nexthere : o->nobj) { if (filterfunc && !(*filterfunc)(o) + /* caller may be asking us to override filterfunc (in order + to do a cockatrice corpse touch check during pickup even + if/when the filter rejects food class) */ && (!augment_filter || o->otyp != CORPSE || !touch_petrifies(&mons[o->corpsenm]))) continue; @@ -465,11 +479,10 @@ boolean FDECL((*filterfunc), (OBJ_P)); sliarray[n].obj = (struct obj *) 0, sliarray[n].indx = -1; sliarray[n].str = (char *) 0; sliarray[n].class = sliarray[n].subclass = sliarray[n].disco = 0; - mode &= ~SORTLOOT_PETRIFY; /* do the sort; if no sorting is requested, we'll just return a sortloot_item array reflecting the current ordering */ - if (mode) { + if (mode && n > 1) { sortlootmode = mode; /* extra input for sortloot_cmp() */ qsort((genericptr_t) sliarray, n, sizeof *sliarray, sortloot_cmp); sortlootmode = 0; /* reset static mode flags */ -- 2.40.0