From adfab4344ebcaa53c3111392395495e58af59176 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 9 Dec 2007 17:24:30 +0000 Subject: [PATCH] Disable nested execute. The execute protocol is flawed and cannot be implemented correctly by asynchronous clients --- unless a client waits for a prompt after sending the execute command and its argument, it is prone to send more input before the C_EXECUTE arrives. That input overtakes the contents of the script file. This is almost certain to happen when the execute is in a script file. Disabling that is probably more useful and certainly less painful than documenting this mess. The client rejects nested execute since servcmd.c rev. 1.42. (EXEC): new. (player_coms): Require it for execute. (player_set_nstat): Set it in nstat. (execute): Clear it in nstat. --- include/player.h | 1 + src/lib/player/empmod.c | 2 +- src/lib/player/init_nats.c | 1 + src/lib/player/player.c | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/player.h b/include/player.h index c38fc27bf..21ded57f8 100644 --- a/include/player.h +++ b/include/player.h @@ -46,6 +46,7 @@ #define SANCT (bit(1) | VIS) #define NORM (bit(2) | VIS) #define GOD (bit(3) | NORM | VIS) +#define EXEC bit(5) #define CAP bit(6) #define MONEY bit(7) diff --git a/src/lib/player/empmod.c b/src/lib/player/empmod.c index 190854a20..a7968a1a5 100644 --- a/src/lib/player/empmod.c +++ b/src/lib/player/empmod.c @@ -100,7 +100,7 @@ struct cmndstr player_coms[] = { 0, edit, C_MOD, GOD}, {"enable", 0, enab, C_MOD, GOD}, {"enlist ", 2, enli, C_MOD, NORM + MONEY + CAP}, - {"execute ", 0, execute, 0, VIS}, + {"execute ", 0, execute, 0, VIS + EXEC }, {"explore ", 1, explore, C_MOD, NORM + MONEY + CAP}, {"financial", 0, fina, 0, NORM}, diff --git a/src/lib/player/init_nats.c b/src/lib/player/init_nats.c index 239eaa74f..6836aa47f 100644 --- a/src/lib/player/init_nats.c +++ b/src/lib/player/init_nats.c @@ -82,5 +82,6 @@ player_set_nstat(struct player *pl, struct natstr *np) pl->nstat |= MONEY; if (np->nat_stat == STAT_ACTIVE && !influx(np)) pl->nstat |= CAP; + pl->nstat |= EXEC; return pl->nstat; } diff --git a/src/lib/player/player.c b/src/lib/player/player.c index 9814ceb84..ac71b7b3e 100644 --- a/src/lib/player/player.c +++ b/src/lib/player/player.c @@ -261,6 +261,7 @@ execute(void) prexec(p); while (!failed && status()) { + player->nstat &= ~EXEC; if (recvclient(buf, sizeof(buf)) < 0) break; if (parse(buf, scanspace, player->argp, player->comtail, @@ -278,6 +279,7 @@ execute(void) if (failed) { while (recvclient(buf, sizeof(buf)) >= 0) ; } + pr("Execute : %s\n", failed ? "aborted" : "terminated"); player->eof = 0; return RET_OK; -- 2.43.0