summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2017-06-13 18:24:42 +0200
committerBardur Arantsson <bardur@scientician.net>2017-06-13 18:24:42 +0200
commit11041734794444255bcf4d5e9041bf3f13c14f2d (patch)
tree134a34e2ca58197b4cc688bba480906bfe22f5f7
parentdc8fa8a9232fa02be448db269d97a2e15e5e7cb5 (diff)
Fix a potential infinite loop using random race modifier choice
-rw-r--r--src/birth.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/birth.cc b/src/birth.cc
index d880f443..77ff56f3 100644
--- a/src/birth.cc
+++ b/src/birth.cc
@@ -1537,11 +1537,19 @@ static bool_ player_birth_aux_ask()
if (c == 'S') return (FALSE);
if (c == '*')
{
- do
- {
- k = rand_int(max_racem);
+ // Which choices are legal?
+ std::vector<int> valid_choices(max_racem);
+ for (int i = 0; i < max_racem; i++) {
+ if ((BIT(racem[i]) & rmp_ptr->choice[racem[i] / 32]))
+ {
+ valid_choices.push_back(i);
+ }
}
- while (!(BIT(racem[k]) & rmp_ptr->choice[racem[k] / 32]));
+
+ // Choose
+ assert(!valid_choices.empty());
+ k = *uniform_element(valid_choices);
+
break;
}
else if (c == '?')