summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2013-09-08 12:36:06 +0200
committerBardur Arantsson <bardur@scientician.net>2013-09-27 14:46:43 +0200
commit5a60ce1f8ab8a6a34cf55b637dd601b5d4422197 (patch)
tree1c5b8423c02f5ab442a340db3d240974b086cff6
parent88767d9fd11638b90e16da05426b19da9ef2b9b9 (diff)
Fix undefined behavior when too many "flag rarity groups" were used
-rw-r--r--src/defines.h6
-rw-r--r--src/init1.cc18
-rw-r--r--src/object2.cc2
-rw-r--r--src/types.h28
4 files changed, 35 insertions, 19 deletions
diff --git a/src/defines.h b/src/defines.h
index 36dca2d6..b010c962 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -358,6 +358,12 @@
/*
+ * Size of flag rarity tables
+ */
+#define FLAG_RARITY_MAX 6
+
+
+/*
* Refueling constants
*/
#define FUEL_TORCH 5000 /* Maximum amount of fuel in a torch */
diff --git a/src/init1.cc b/src/init1.cc
index 646e8083..7730467a 100644
--- a/src/init1.cc
+++ b/src/init1.cc
@@ -6316,6 +6316,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool_ obvious)
{
int i;
+ assert(n < FLAG_RARITY_MAX);
/* Check flags1 */
for (i = 0; i < 32; i++)
@@ -6643,7 +6644,7 @@ errr init_e_info_txt(FILE *fp, char *buf)
{
e_ptr->tval[j] = 255;
}
- for (j = 0; j < 5; j++)
+ for (j = 0; j < FLAG_RARITY_MAX; j++)
{
e_ptr->rar[j] = 0;
e_ptr->flags1[j] = 0;
@@ -6652,6 +6653,13 @@ errr init_e_info_txt(FILE *fp, char *buf)
e_ptr->flags4[j] = 0;
e_ptr->flags5[j] = 0;
e_ptr->esp[j] = 0;
+ e_ptr->oflags1[j] = 0;
+ e_ptr->oflags2[j] = 0;
+ e_ptr->oflags3[j] = 0;
+ e_ptr->oflags4[j] = 0;
+ e_ptr->oflags5[j] = 0;
+ e_ptr->oesp[j] = 0;
+ e_ptr->fego[j] = 0;
}
/* Next... */
@@ -6689,14 +6697,16 @@ errr init_e_info_txt(FILE *fp, char *buf)
{
int rar;
- if (cur_r == 5) return 1;
+ cur_r++;
+
+ if (cur_r >= FLAG_RARITY_MAX) {
+ return 1;
+ }
/* Scan for the values */
if (1 != sscanf(buf + 2, "%d",
&rar)) return (1);
- cur_r++;
-
/* Save the values */
e_ptr->rar[cur_r] = rar;
diff --git a/src/object2.cc b/src/object2.cc
index c2808957..754a6b91 100644
--- a/src/object2.cc
+++ b/src/object2.cc
@@ -4277,7 +4277,7 @@ try_an_other_ego:
e_ptr = &e_info[e_idx];
/* Hack -- extra powers */
- for (j = 0; j < 5; j++)
+ for (j = 0; j < FLAG_RARITY_MAX; j++)
{
/* Rarity check */
if (magik(e_ptr->rar[j]))
diff --git a/src/types.h b/src/types.h
index 22bc3bf5..b629c0e3 100644
--- a/src/types.h
+++ b/src/types.h
@@ -318,20 +318,20 @@ struct ego_item_type
s32b cost; /* Ego-item "cost" */
- byte rar[5];
- u32b flags1[5]; /* Ego-Item Flags, set 1 */
- u32b flags2[5]; /* Ego-Item Flags, set 2 */
- u32b flags3[5]; /* Ego-Item Flags, set 3 */
- u32b flags4[5]; /* Ego-Item Flags, set 4 */
- u32b flags5[5]; /* Ego-Item Flags, set 5 */
- u32b esp[5]; /* ESP flags */
- u32b oflags1[5]; /* Ego-Item Obvious Flags, set 1 */
- u32b oflags2[5]; /* Ego-Item Obvious Flags, set 2 */
- u32b oflags3[5]; /* Ego-Item Obvious Flags, set 3 */
- u32b oflags4[5]; /* Ego-Item Obvious Flags, set 4 */
- u32b oflags5[5]; /* Ego-Item Obvious Flags, set 5 */
- u32b oesp[5]; /* Obvious ESP flags */
- u32b fego[5]; /* ego flags */
+ byte rar[FLAG_RARITY_MAX];
+ u32b flags1[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 1 */
+ u32b flags2[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 2 */
+ u32b flags3[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 3 */
+ u32b flags4[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 4 */
+ u32b flags5[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 5 */
+ u32b esp[FLAG_RARITY_MAX]; /* ESP flags */
+ u32b oflags1[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 1 */
+ u32b oflags2[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 2 */
+ u32b oflags3[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 3 */
+ u32b oflags4[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 4 */
+ u32b oflags5[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 5 */
+ u32b oesp[FLAG_RARITY_MAX]; /* Obvious ESP flags */
+ u32b fego[FLAG_RARITY_MAX]; /* ego flags */
u32b need_flags1; /* Ego-Item Flags, set 1 */
u32b need_flags2; /* Ego-Item Flags, set 2 */