fix #H9082 - post-3.6.2 monster throwing crash

Changing
  if (ammo_and_launcher(otmp, uwep) && mwep->otyp == ELVEN_BOW)
(with 'uwep' typo) to
  if (mwep->otyp == ELVEN_BOW && ammo_and_launcher(otmp, mwep))
(with fixed 'mwep') moved ammo_and_launcher()'s hidden non-null
test to after 'mwep->otyp'.  If mwep was Null (so monster must be
throwing non-ammo such as darts or daggers rather than shooting
with a launcher), a crash occurred.  (Throwing such things while
the monster is wielding any weapon doesn't have this problem.)

I don't think 3.6.2 can crash here.  If hero's uwep is a bow, otmp
must be arrows to get past pre-3.6.3's incorrect ammo_and_launcher()
check.  And a monster won't shoot arrows unless wielding a bow, so
monster's mwep would be non-Null regardless of what uwep is.

I tested a kobold with darts and an elven bow.  But I also gave it
one elven arrow to provoke it into wielding the bow and my test
didn't throw darts with nothing wielded....
This commit is contained in:
PatR
2019-08-02 10:42:26 -07:00
parent 31c8038344
commit 55e166ba08
2 changed files with 6 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 mthrowu.c $NHDT-Date: 1564608121 2019/07/31 21:22:01 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.84 $ */
/* NetHack 3.6 mthrowu.c $NHDT-Date: 1564767726 2019/08/02 17:42:06 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.85 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Pasi Kallinen, 2016. */
/* NetHack may be freely redistributed. See license for details. */
@@ -183,10 +183,10 @@ struct obj *otmp, *mwep;
/* Elven Craftsmanship makes for light, quick bows */
if (otmp->otyp == ELVEN_ARROW && !otmp->cursed)
multishot++;
/* for arrow, we checked bow&arrow at start of block, but for
/* for arrow, we checked bow&arrow when entering block, but for
bow, so far we've only validated that otmp is a weapon stack;
need to verify that it's a stack of arrows rather than darts */
if (mwep->otyp == ELVEN_BOW && ammo_and_launcher(otmp, mwep)
if (mwep && mwep->otyp == ELVEN_BOW && ammo_and_launcher(otmp, mwep)
&& !mwep->cursed)
multishot++;
/* 1/3 of launcher enchantment */