From dfa56cb0ef682afa0b397308de95e03f1fa3a3a4 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 25 Sep 2005 09:49:36 +0000 Subject: [PATCH] (diridx): New. Use instead of chkdir() where direction characters must be valid. Oopses on bad direction characters. (pathtoxy, ac_encounter): Bad direction characters used to lead to bad array subscript and potential disaster. (pathrange, path): Stop on DIR_STOP as well as on bad direction characters. This is just for consistency with other code; DIR_STOP should occur only last in a path here. (sail_nav_fleet, nav_ship): No change except for the oops. --- include/path.h | 1 + src/lib/commands/path.c | 5 ++++- src/lib/subs/aircombat.c | 2 +- src/lib/subs/paths.c | 30 +++++++++++++++++++++--------- src/lib/update/nav_ship.c | 5 +---- src/lib/update/sail.c | 6 +++--- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/include/path.h b/include/path.h index 25c57b2b..d91d4818 100644 --- a/include/path.h +++ b/include/path.h @@ -63,6 +63,7 @@ extern double ncost(struct sctstr *, natid); extern double pathtoxy(s_char *, coord *, coord *, double (*)(struct sctstr * sp, natid own)); extern int chkdir(s_char, int, int); +extern int diridx(char); extern void direrr(s_char *, s_char *, s_char *); extern void pathrange(register coord, register coord, register s_char *, int, struct range *); diff --git a/src/lib/commands/path.c b/src/lib/commands/path.c index 9748a0ce..926e086e 100644 --- a/src/lib/commands/path.c +++ b/src/lib/commands/path.c @@ -101,7 +101,10 @@ path(void) natp = getnatp(player->cnum); xyrelrange(natp, &absrange, &relrange); blankfill((s_char *)mapbuf, &ns.range, 3); - while (*pp && (i = chkdir(*pp, DIR_STOP, DIR_LAST)) >= 0) { + for (; *pp; ++pp) { + i = diridx(*pp); + if (i == DIR_STOP) + break; memcpy(&map[deltay(cy, ns.range.ly)][deltax(cx, ns.range.lx) * 2], routech[i][0], 3); diff --git a/src/lib/subs/aircombat.c b/src/lib/subs/aircombat.c index 6ea14bfb..606fadd9 100644 --- a/src/lib/subs/aircombat.c +++ b/src/lib/subs/aircombat.c @@ -129,7 +129,7 @@ ac_encounter(struct emp_qelem *bomb_list, struct emp_qelem *esc_list, pln_removedupes(bomb_list, esc_list); while ((dir = mypath[myp++]) && !QEMPTY(bomb_list)) { - if ((val = chkdir(dir, DIR_STOP, DIR_LAST)) == 0) + if ((val = diridx(dir)) == DIR_STOP) break; /* XXX using xnorm is probably bad */ x = xnorm(x + diroff[val][0]); diff --git a/src/lib/subs/paths.c b/src/lib/subs/paths.c index b4536ea6..322c57f1 100644 --- a/src/lib/subs/paths.c +++ b/src/lib/subs/paths.c @@ -66,6 +66,21 @@ direrr(s_char *stop_msg, s_char *view_msg, s_char *map_msg) pr(map_msg, dirch[DIR_MAP]); } +/* + * Map direction DIR to a direction index DIR_STOP..DIR_LAST. + * DIR must be a valid direction. + */ +int +diridx(char dir) +{ + unsigned i = dir - 'a'; + + if (CANT_HAPPEN(i >= sizeof(dirindex) / sizeof(*dirindex) + || dirindex[i] < 0)) + return DIR_STOP; + return dirindex[i]; +} + /* * return pointer to path; prompt user until a stop char * or a bomb char have been entered. A "bomb" char in @@ -213,19 +228,15 @@ pathtoxy(s_char *path, coord *xp, coord *yp, coord y; int val; double m; - int c; x = *xp; y = *yp; m = 0.0; for (pp = path; *pp; pp++) { - if ((val = chkdir(*pp, DIR_STOP, DIR_LAST)) == 0) + if ((val = diridx(*pp)) == DIR_STOP) break; x += diroff[val][0]; y += diroff[val][1]; - c = dirch[val]; - if (c == DIR_STOP) - break; if (!getsect(x, y, &s)) return -1.0; m += cost(&s, s.sct_own); @@ -236,8 +247,7 @@ pathtoxy(s_char *path, coord *xp, coord *yp, } void -pathrange(register coord cx, register coord cy, register s_char *pp, - int border, struct range *range) +pathrange(coord cx, coord cy, s_char *pp, int border, struct range *range) { int dir; @@ -247,8 +257,10 @@ pathrange(register coord cx, register coord cy, register s_char *pp, range->hy = cy; range->width = 0; range->height = 0; - while ((dir = chkdir(*pp, DIR_FIRST, DIR_LAST)) >= 0) { - pp++; + for (; *pp; pp++) { + dir = diridx(*pp); + if (dir == DIR_STOP) + break; cx += diroff[dir][0]; cy += diroff[dir][1]; if (cx < range->lx) diff --git a/src/lib/update/nav_ship.c b/src/lib/update/nav_ship.c index ee38cb96..5b0c7017 100644 --- a/src/lib/update/nav_ship.c +++ b/src/lib/update/nav_ship.c @@ -303,14 +303,11 @@ nav_ship(struct shpstr *sp) stopping = 0; while (*cp && !stopping && sp->shp_own && mlp->mobil > 0.0) { - dir = chkdir(*cp++, DIR_STOP, DIR_LAST); - + dir = diridx(*cp++); stopping |= shp_nav_one_sector(&ship_list, dir, sp->shp_own, 0); } -/* sp->shp_mobil = (int) mobil; - */ /* Ship not sunk */ if (sp->shp_own) nav_check_atdest(sp); diff --git a/src/lib/update/sail.c b/src/lib/update/sail.c index 6045e5d8..dba8d506 100644 --- a/src/lib/update/sail.c +++ b/src/lib/update/sail.c @@ -262,10 +262,10 @@ sail_nav_fleet(struct fltheadstr *fltp) own = sp->shp_own; fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */ for (s = sp->shp_path; (*s) && (fltp->maxmoves > 0); s++) { - dir = chkdir(*s, DIR_STOP, DIR_LAST); - if (0 != (error = shp_nav_one_sector(&ship_list, dir, own, 0))) + dir = diridx(*s); + if (0 != shp_nav_one_sector(&ship_list, dir, own, 0)) fltp->maxmoves = 1; - --(fltp->maxmoves); + --fltp->maxmoves; } shp_put(&ship_list, own); getship(sp->shp_uid, &ship);