Avoid false positive generation oops in navigate and march
Commite3cf1e32
(v4.3.27) created make_stale_if_command_arg() to permit catching more potential yields on input. Unfortunately, the implementation of navigate and march sub-commands 'r', 'l' and 's' breaks it. do_unit_move() reads units into a unit list at the beginning and at each stop. It writes them back when they move or sweep. If a unit changed in the file in between, the changes would get wiped out. Therefore, do_unit_move() must not yield between stops. do_unit_move() parses sub-commands into player->argp[], then supplies defaults for missing arguments, so that code using them (radar(), do_look(), sona(), mine(), landmine()) won't prompt for missing arguments. Unclean and brittle. See also commit28cc236e
and commit45106ab9
. Unfortunately, make_stale_if_command_arg() doesn't recognize the difference between these defaulted arguments and parsed arguments, so it makes objects stale, even though the defaulted arguments can't be missing. If a move or sweep follows, it triggers a false positive generation oops. To fix, test "points into argument buffer" (only true for parsed arguments) instead of "is in player->argp[]". Requires making the argument buffer accessible: new struct player member argbuf[]. Use it for parsing commands, in command(), execute(), do_unit_move(). Don't use it in emp_config(), player_login(), move_ground(), because these parse something else.
This commit is contained in:
parent
36015e8c0e
commit
3de1e8be28
3 changed files with 9 additions and 23 deletions
|
@ -68,6 +68,7 @@ struct player {
|
|||
struct cmndstr *command; /* currently executing command */
|
||||
struct iop *iop;
|
||||
char combuf[1024]; /* command input buffer, UTF-8 */
|
||||
char argbuf[1024]; /* argument buffer, ASCII */
|
||||
char *argp[128]; /* arguments, ASCII, valid if command */
|
||||
char *condarg; /* conditional, ASCII, valid if command */
|
||||
char *comtail[128]; /* start of args in combuf[] */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue