Bug #1460 ยป 0085-Fix-crash-on-unit_make_contact-call-with-a-dead-unit.patch
| server/unittools.c | ||
|---|---|---|
|   bool unit_lives; | ||
|   bool adj; | ||
|   enum direction8 facing; | ||
|   bool flagless = unit_has_type_flag(punit, UTYF_FLAGLESS); | ||
|   /* Some checks. */ | ||
|   fc_assert_ret_val(punit != NULL, FALSE); | ||
| ... | ... | |
|   if (unit_lives) { | ||
|     wakeup_neighbor_sentries(punit); | ||
|   } | ||
|   unit_make_contact(punit, pdesttile, pplayer); | ||
|   /* Do not pass 'punit' to unit_make_contact(), as it | ||
|    * might refer to a dead unit. | ||
|    * Flagless units do not make contact. */ | ||
|   if (!flagless) { | ||
|     unit_make_contact(nullptr, pdesttile, pplayer); | ||
|   } | ||
|   if (unit_lives) { | ||
|     /* Special checks for ground units in the ocean. */ | ||
| ... | ... | |
|   owner if nullptr, but they may be different. | ||
| **************************************************************************/ | ||
| void unit_make_contact(const struct unit *punit, | ||
|                        struct tile *ptile, struct player *pplayer) { | ||
|   fc_assert_ret(punit != nullptr); | ||
|                        struct tile *ptile, struct player *pplayer) | ||
| { | ||
|   fc_assert_ret(punit != nullptr | ||
|                 || (ptile != nullptr && pplayer != nullptr)); | ||
|   if (unit_has_type_flag(punit, UTYF_FLAGLESS)) { | ||
|   if (punit != nullptr && unit_has_type_flag(punit, UTYF_FLAGLESS)) { | ||
|     return; /* Flagless unit can't make contact */ | ||
|   } | ||
|   maybe_make_contact(ptile ? ptile : unit_tile(punit), | ||
|                      pplayer ? pplayer : unit_owner(punit)); | ||
|   maybe_make_contact(ptile != nullptr ? ptile : unit_tile(punit), | ||
|                      pplayer != nullptr ? pplayer : unit_owner(punit)); | ||
| } | ||