diff options
author | Bardur Arantsson <bardur@scientician.net> | 2013-09-08 12:36:06 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2013-09-27 14:46:43 +0200 |
commit | 5a60ce1f8ab8a6a34cf55b637dd601b5d4422197 (patch) | |
tree | 1c5b8423c02f5ab442a340db3d240974b086cff6 | |
parent | 88767d9fd11638b90e16da05426b19da9ef2b9b9 (diff) |
Fix undefined behavior when too many "flag rarity groups" were used
-rw-r--r-- | src/defines.h | 6 | ||||
-rw-r--r-- | src/init1.cc | 18 | ||||
-rw-r--r-- | src/object2.cc | 2 | ||||
-rw-r--r-- | src/types.h | 28 |
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 */ |