]> granicus.if.org Git - nethack/commitdiff
rnd_class()
authorPatR <rankin@nethack.org>
Mon, 13 Jan 2020 06:16:49 +0000 (22:16 -0800)
committerPatR <rankin@nethack.org>
Mon, 13 Jan 2020 06:16:49 +0000 (22:16 -0800)
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).

src/objnam.c

index a85f502d43a5e6ec9a1369da5c42c73c499d0561..102dbb03e7eb34457215093361f18fa2c9bdaf39 100644 (file)
@@ -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 *