From: Pasi Kallinen Date: Sat, 5 Mar 2022 08:06:01 +0000 (+0200) Subject: Fix segfault with uball X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fab1048f2fb2b44bc5fdf00bedfd5afe33b37127;p=nethack Fix segfault with uball Drowning in a pool while punished and carrying the ball, and the only available space to crawl back on dry land has a magic trap, which unpunishes you. --- diff --git a/src/teleport.c b/src/teleport.c index baae6f350..37bbcdef9 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -365,8 +365,14 @@ teleds(int nux, int nuy, int teleds_flags) if (drag_ball(nux, nuy, &bc_control, &ballx, &bally, &chainx, &chainy, &cause_delay, allow_drag)) move_bc(0, bc_control, ballx, bally, chainx, chainy); - else /* dragging fails if hero is encumbered beyond 'burdened' */ - unplacebc(); /* to match placebc() below */ + else { + /* dragging fails if hero is encumbered beyond 'burdened' */ + /* uball might've been cleared via drag_ball -> spoteffects -> + dotrap -> magic trap unpunishment */ + ball_active = (Punished && uball->where != OBJ_FREE); + if (ball_active) + unplacebc(); /* to match placebc() below */ + } } /* must set u.ux, u.uy after drag_ball(), which may need to know