From: Markus Armbruster Date: Sun, 22 May 2011 06:20:25 +0000 (+0200) Subject: Verify carrier references are sane X-Git-Tag: v4.3.28~40 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=6f6d76fcc98c37f3fe7d069d3aefbf29d8a5ff36 Verify carrier references are sane Catch bad references here, before unit_cargo_init() chokes on them. --- diff --git a/src/lib/common/ef_verify.c b/src/lib/common/ef_verify.c index 7709974ab..7dabfa55b 100644 --- a/src/lib/common/ef_verify.c +++ b/src/lib/common/ef_verify.c @@ -193,6 +193,82 @@ verify_row(int type, int row) return ret_val; } +static int +verify_planes(int may_put) +{ + int retval = 0; + int i; + struct plnstr *pp; + + /* laziness: assumes plane file is EFF_MEM */ + for (i = 0; (pp = getplanep(i)); i++) { + if (pp->pln_own) { + if (pp->pln_ship >= 0 && pp->pln_land >= 0) { + verify_fail(EF_PLANE, i, NULL, 0, "on two carriers"); + retval = -1; + } + } else { + if (pp->pln_ship >= 0 || pp->pln_land >= 0) { + pp->pln_ship = pp->pln_land = -1; + if (may_put) + putplane(i, pp); + verify_fail(EF_PLANE, i, NULL, 0, + "ghost stuck on carrier (fixed)"); + } + } + } + return retval; +} + +static int +verify_lands(int may_put) +{ + int retval = 0; + int i; + struct lndstr *lp; + + /* laziness: assumes land file is EFF_MEM */ + for (i = 0; (lp = getlandp(i)); i++) { + if (lp->lnd_own) { + if (lp->lnd_ship >= 0 && lp->lnd_land >= 0) { + verify_fail(EF_LAND, i, NULL, 0, "on two carriers"); + retval = -1; + } + } else { + if (lp->lnd_ship >= 0 || lp->lnd_land >= 0) { + lp->lnd_ship = lp->lnd_land = -1; + if (may_put) + putland(i, lp); + verify_fail(EF_LAND, i, NULL, 0, + "ghost stuck on carrier (fixed)"); + } + } + } + return retval; +} + +static int +verify_nukes(int may_put) +{ + int retval = 0; + int i; + struct nukstr *np; + + /* laziness: assumes nuke file is EFF_MEM */ + for (i = 0; (np = getnukep(i)); i++) { + if (!np->nuk_own) { + if (np->nuk_plane >= 0) { + np->nuk_plane = -1; + if (may_put) + putnuke(i, np); + verify_fail(EF_NUKE, i, NULL, 0, + "ghost stuck on carrier (fixed)"); + } + } + } + return retval; +} + static void pln_zap_transient_flags(int may_put) { @@ -237,6 +313,9 @@ ef_verify(int may_put) } /* Special checks */ + retval |= verify_planes(may_put); + retval |= verify_lands(may_put); + retval |= verify_nukes(may_put); for (i = 0; pchr[i].p_sname; i++) { if (!pchr[i].p_sname[0]) continue;