From 0faceac07047244026c23d5e9736961a90ae98eb Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 29 Mar 2013 18:19:40 +0100 Subject: [PATCH] edit: Detect concurrent updates during interactive nation edit Unlike other edits, editing a country modifies the object in-place. It has to, because editing may send bulletins, which updates nat_tgms, and writing back a copy would clobber these updates, triggering a seqno mismatch oops. However, the in-place editing neglects to detect concurrent updates. Fix that. Signed-off-by: Markus Armbruster --- src/lib/commands/edit.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/commands/edit.c b/src/lib/commands/edit.c index 5a65782b7..6f8564853 100644 --- a/src/lib/commands/edit.c +++ b/src/lib/commands/edit.c @@ -93,6 +93,7 @@ edit(void) np = natargp(player->argp[2], "Country? "); if (!np) return RET_SYN; + item.nat = *np; break; case 'p': if ((num = onearg(player->argp[2], "Plane number? ")) < 0) @@ -158,11 +159,19 @@ edit(void) switch (ewhat) { case 'c': + if (!check_obj_ok(&item.gen)) + return RET_FAIL; + /* + * edit_nat() may update the edited country by sending it + * bulletins. Writing back item.nat would trigger a seqno + * mismatch oops. Workaround: edit in-place. + */ ret = edit_nat(np, key, ptr); if (ret != RET_OK) return ret; if (!putnat(np)) return RET_FAIL; + item.nat = *np; break; case 'l': if (!check_sect_ok(&item.sect)) -- 2.43.0