From 863fde5a2c90cafbdbf5b5f181dba42723c3a82d Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 29 Nov 2015 10:37:40 +0100 Subject: [PATCH] march: Fix concurrent updates at sector abandon prompt When the player declines to abandon a sector, we write back stale land units, triggering a generation oops. Any updates made by other threads meanwhile are wiped out, triggering a seqno mismatch oops. The culprit is lnd_abandon_askyn(): when the player declines, it returns without calling check_sect_ok(), check_land_ok(). Broken in commit 7c1b166, v4.3.33. Fix it. Signed-off-by: Markus Armbruster --- src/lib/subs/lndsub.c | 6 +++--- tests/navi-march/server.log | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/lib/subs/lndsub.c b/src/lib/subs/lndsub.c index 96bd53e1..f7e4e26b 100644 --- a/src/lib/subs/lndsub.c +++ b/src/lib/subs/lndsub.c @@ -963,21 +963,21 @@ int lnd_abandon_askyn(struct emp_qelem *list) { struct ulist *llp; struct sctstr sect; + int abandon; struct emp_qelem *qp; if (QEMPTY(list)) return 1; llp = (struct ulist *)list->q_back; getsect(llp->unit.land.lnd_x, llp->unit.land.lnd_y, §); - if (!abandon_askyn(§, I_CIVIL, 0, llp)) - return 0; + abandon = abandon_askyn(§, I_CIVIL, 0, llp); if (!check_sect_ok(§)) return 0; for (qp = list->q_back; qp != list; qp = qp->q_back) { if (!check_land_ok(&((struct ulist *)qp)->unit.land)) return 0; } - return 1; + return abandon; } int diff --git a/tests/navi-march/server.log b/tests/navi-march/server.log index 5a0c4c93..b5b9382b 100644 --- a/tests/navi-march/server.log +++ b/tests/navi-march/server.log @@ -12,10 +12,6 @@ tester@127.0.0.1 logged out, country #1 Connect from 127.0.0.1 tester@127.0.0.1 using country #1 tester@127.0.0.1 logged in as country #1 -Oops: elt->generation != (ef_generation & 0xfff) in ../src/lib/common/file.c:699 -Crash dump complete -Oops: elt->generation != (ef_generation & 0xfff) in ../src/lib/common/file.c:699 -Crash dump complete tester@127.0.0.1 logged out, country #1 Connect from 127.0.0.1 tester@127.0.0.1 using country #0