(parse): Support 127 arguments instead of 100, to match
player->argp[]. Assign complete argument vector. This should make buffer overruns blatantly obvious. (parse): Don't bother checking SPACE argument, just crash. It is extremely unlikely that such a programming error wouldn't be discovered by even them most superficial testing.
This commit is contained in:
parent
9ee7a02be8
commit
ac671d25e4
2 changed files with 25 additions and 24 deletions
|
@ -386,8 +386,7 @@ extern int min(int, int);
|
|||
#endif
|
||||
extern s_char *effadv(int);
|
||||
extern int onearg(s_char *, s_char *);
|
||||
extern int parse(register s_char *, s_char **, s_char **, s_char *,
|
||||
s_char **);
|
||||
extern int parse(char *, char **, char **, char *, char **);
|
||||
extern int ldround(double, int);
|
||||
extern int roundintby(int, int);
|
||||
extern int scthash(register int, register int, int);
|
||||
|
|
|
@ -31,36 +31,39 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* parse empire command line, chop into argp
|
||||
* If values argpp and spacep passed, parse will use them.
|
||||
* otherwise, parse will use static space and global argp.
|
||||
* parse assumes that argpp is a char *buf[16], and that spacep
|
||||
* points to a buf of at least 256 bytes.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include "misc.h"
|
||||
#include "gen.h"
|
||||
|
||||
/*
|
||||
* Parse user command in BUF.
|
||||
* BUF is user text.
|
||||
* Set ARG[0] to point to the command name.
|
||||
* Set ARG[1..N] to point to arguments, where N is the number of
|
||||
* arguments. Set ARG[N+1..127] to NULL.
|
||||
* If *CONDP is not null, recognize conditional argument syntax, and
|
||||
* set *CONDP to the conditional argument if present, else NULL.
|
||||
* Command name and arguments are copied into SPACE[], whose size must
|
||||
* be at least strlen(BUF) + 1.
|
||||
* If *REDIR is not null, recognize the redirection syntax, and set
|
||||
* *REDIR to redirection string if present, else NULL. The
|
||||
* redirection string is user text.
|
||||
* Return number of slots used in ARG[], or -1 on error.
|
||||
*/
|
||||
int
|
||||
parse(register s_char *buf, s_char **argpp, s_char **condp, s_char *space,
|
||||
s_char **redir)
|
||||
parse(char *buf, char **arg, char **condp, char *space, char **redir)
|
||||
{
|
||||
register s_char *bp2;
|
||||
register s_char *bp1 = space;
|
||||
register s_char **arg = argpp;
|
||||
char *bp2;
|
||||
char *bp1 = space;
|
||||
int fs;
|
||||
int quoted;
|
||||
int argnum;
|
||||
|
||||
if (space == 0)
|
||||
return -1;
|
||||
if (redir)
|
||||
*redir = 0;
|
||||
if (condp != 0)
|
||||
*condp = 0;
|
||||
for (argnum = 0; *buf && argnum < 100;) {
|
||||
if (condp != NULL)
|
||||
*condp = NULL;
|
||||
for (argnum = 0; *buf && argnum < 127;) {
|
||||
while (isspace(*buf))
|
||||
buf++;
|
||||
if (!*buf)
|
||||
|
@ -86,15 +89,14 @@ parse(register s_char *buf, s_char **argpp, s_char **condp, s_char *space,
|
|||
}
|
||||
}
|
||||
*bp1++ = 0;
|
||||
if (*bp2 == '?' && condp != 0) {
|
||||
if (*bp2 == '?' && condp != NULL) {
|
||||
*condp = bp2 + 1;
|
||||
} else {
|
||||
arg[argnum] = bp2;
|
||||
argnum++;
|
||||
}
|
||||
}
|
||||
arg[argnum] = 0;
|
||||
for (fs = argnum + 1; fs < 16; fs++)
|
||||
arg[fs] = 0;
|
||||
for (fs = argnum; fs < 128; fs++)
|
||||
arg[fs] = NULL;
|
||||
return argnum;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue