]> git.pond.sub.org Git - empserver/commitdiff
march: Fix concurrent updates at sector abandon prompt
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 29 Nov 2015 09:37:40 +0000 (10:37 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sat, 5 Dec 2015 12:19:38 +0000 (13:19 +0100)
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 <armbru@pond.sub.org>
src/lib/subs/lndsub.c
tests/navi-march/server.log

index 96bd53e12be8ea585dc23361ec0d12e73d5c5ead..f7e4e26be6bb5a73071a3fff90892b21d30929ed 100644 (file)
@@ -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, &sect);
-    if (!abandon_askyn(&sect, I_CIVIL, 0, llp))
-       return 0;
+    abandon = abandon_askyn(&sect, I_CIVIL, 0, llp);
     if (!check_sect_ok(&sect))
        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
index 5a0c4c933e2c77dcc0b3f43b2f34424059416c44..b5b9382b35987a01775dbd8206905c69e767c315 100644 (file)
@@ -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