OSDN Git Service

ガラスの破片がモンスターを倒した時、ガラスの破片(who == -2)に対して経験値を与えようとするため配列外アクセスが起きていたバグを修正。
authorhabu <habu@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 27 Feb 2010 02:27:21 +0000 (02:27 +0000)
committerhabu <habu@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 27 Feb 2010 02:27:21 +0000 (02:27 +0000)
また、monster_gain_exp()の引数をチェックし配列外アクセスの発生を予防するようにした。

src/melee2.c
src/spells1.c

index e050863..793690c 100644 (file)
@@ -4571,11 +4571,22 @@ bool process_the_world(int num, int who, bool vs_player)
 
 void monster_gain_exp(int m_idx, int s_idx)
 {
-       monster_type *m_ptr = &m_list[m_idx];
-       monster_race *r_ptr = &r_info[m_ptr->r_idx];
-       monster_race *s_ptr = &r_info[s_idx];
+       monster_type *m_ptr;
+       monster_race *r_ptr;
+       monster_race *s_ptr;
        int new_exp;
 
+       /* Paranoia */
+       if (m_idx <= 0 || s_idx <= 0) return;
+
+       m_ptr = &m_list[m_idx];
+
+       /* Paranoia -- Skip dead monsters */
+       if (!m_ptr->r_idx) return;
+
+       r_ptr = &r_info[m_ptr->r_idx];
+       s_ptr = &r_info[s_idx];
+
        if (p_ptr->inside_battle) return;
 
        if (!r_ptr->next_exp) return;
index 291f638..e1887b2 100644 (file)
@@ -6026,7 +6026,7 @@ note = "
                                }
                        }
 
-                       monster_gain_exp(who, m_ptr->r_idx);
+                       if (who > 0) monster_gain_exp(who, m_ptr->r_idx);
 
                        /* Generate treasure, etc */
                        monster_death(c_ptr->m_idx, FALSE);