From: PatR Date: Mon, 13 Jan 2020 06:16:49 +0000 (-0800) Subject: rnd_class() X-Git-Tag: NetHack-3.7.0_WIP~54 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b7e9d67d38bc1e6c6bb4b3793fba9bd0a6b15a7;p=nethack rnd_class() Guard against potential bad arguments: first index greaer than last. Return STRANGE_OBJECT instead of hardcoded 0 if it ever fails (which should be impossible with good arguments). --- diff --git a/src/objnam.c b/src/objnam.c index a85f502d4..102dbb03e 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.7 objnam.c $NHDT-Date: 1578535246 2020/01/09 02:00:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.285 $ */ +/* NetHack 3.7 objnam.c $NHDT-Date: 1578896203 2020/01/13 06:16:43 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.287 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -4237,17 +4237,18 @@ int first, last; { int i, x, sum = 0; - if (first == last) - return first; - for (i = first; i <= last; i++) - sum += objects[i].oc_prob; - if (!sum) /* all zero */ - return first + rn2(last - first + 1); - x = rnd(sum); - for (i = first; i <= last; i++) - if (objects[i].oc_prob && (x -= objects[i].oc_prob) <= 0) - return i; - return 0; + if (last > first) { + for (i = first; i <= last; i++) + sum += objects[i].oc_prob; + if (!sum) /* all zero, so equal probability */ + return rn1(last - first + 1, first); + + x = rnd(sum); + for (i = first; i <= last; i++) + if ((x -= objects[i].oc_prob) <= 0) + return i; + } + return (first == last) ? first : STRANGE_OBJECT; } static const char *