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 <armbru@pond.sub.org>
np = natargp(player->argp[2], "Country? ");
if (!np)
return RET_SYN;
np = natargp(player->argp[2], "Country? ");
if (!np)
return RET_SYN;
break;
case 'p':
if ((num = onearg(player->argp[2], "Plane number? ")) < 0)
break;
case 'p':
if ((num = onearg(player->argp[2], "Plane number? ")) < 0)
switch (ewhat) {
case 'c':
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;
ret = edit_nat(np, key, ptr);
if (ret != RET_OK)
return ret;
if (!putnat(np))
return RET_FAIL;
break;
case 'l':
if (!check_sect_ok(&item.sect))
break;
case 'l':
if (!check_sect_ok(&item.sect))