diff urogue/command.c @ 276:4573b355cdc1

UltraRogue: prevent bad array accesses in call(). Marking non-magic items caused segfaults because item_color was set to NULL. item_type could also be used as an out-of-bounds index. These problems have been fixed by only using these variables when the mark argument is false, in which case they are properly initialized. A fall-through case statement was also fixed.
author John "Elwin" Edwards
date Sun, 10 Sep 2017 21:04:22 -0400
parents 88bd51f231e7
children e52a8a7ad4c5
line wrap: on
line diff
--- a/urogue/command.c	Sat Sep 09 07:25:23 2017 -0400
+++ b/urogue/command.c	Sun Sep 10 21:04:22 2017 -0400
@@ -1303,6 +1303,7 @@
         case STICK:
             item_type = TYP_STICK;
             item_color = ws_made;
+            break;
         default:
             if (!mark)
             {
@@ -1312,10 +1313,7 @@
             break;
     }
 
-    elsewise = (guess_items[item_type][obj->o_which] != NULL ?
-       guess_items[item_type][obj->o_which] : item_color[obj->o_which]);
-
-    if (know_items[item_type][obj->o_which] && !mark)
+    if (!mark && know_items[item_type][obj->o_which])
     {
         msg("That has already been identified.");
         return;
@@ -1331,6 +1329,9 @@
     }
     else
     {
+        elsewise = (guess_items[item_type][obj->o_which] != NULL ?
+           guess_items[item_type][obj->o_which] : item_color[obj->o_which]);
+
         msg("Was called \"%s\".", elsewise);
         msg("What do you want to call it? ");