Fix treatment of EOF from player
Commit79407e68
(v4.3.11) changed recvclient() to keep failing after receiving EOF from player. This was bad, because some places getting input check player->aborted instead of recvclient() failure, and player->aborted wasn't set on EOF. Bugs caused by this: * comm_bomb(), ship_bomb(), plane_bomb(), land_bomb() went into an infinite loop that eventually ate all memory. * deli(), desi(), dist(), fly(), morale(), zdon(), att_prompt(), ask_move_in() interpreted EOF as empty input instead of no more input. * cmd_sail_ship() dereferenced a null pointer. Fix by setting player->aborted on EOF, too. (cherry picked from commitb3a7a8ee11
)
This commit is contained in:
parent
80b57b2f95
commit
b9b0710128
3 changed files with 8 additions and 7 deletions
|
@ -47,7 +47,8 @@
|
|||
* This may block for input, yielding the processor. Flush buffered
|
||||
* output when blocking, to make sure player sees the prompt.
|
||||
* If the player's connection has the I/O error or EOF indicator set,
|
||||
* or the line is "ctld", set the player's eof flag and return -1.
|
||||
* or the line is "ctld", set the player's eof and aborted flag and
|
||||
* return -1.
|
||||
* If the line is "aborted", set the player's aborted flag and return
|
||||
* -2.
|
||||
* Else return the length of the line.
|
||||
|
@ -59,13 +60,13 @@ recvclient(char *cmd, int size)
|
|||
int count;
|
||||
|
||||
count = -1;
|
||||
while (!player->aborted && !player->eof) {
|
||||
while (!player->aborted) {
|
||||
/* Try to get a line of input */
|
||||
count = io_gets(player->iop, cmd, size);
|
||||
if (count >= 0) {
|
||||
/* got it */
|
||||
if (strcmp(cmd, "ctld") == 0)
|
||||
player->eof = 1;
|
||||
player->aborted = player->eof = 1;
|
||||
if (strcmp(cmd, "aborted") == 0)
|
||||
player->aborted = 1;
|
||||
journal_input(cmd);
|
||||
|
@ -85,10 +86,10 @@ recvclient(char *cmd, int size)
|
|||
/* Await more input */
|
||||
io_input(player->iop, IO_WAIT);
|
||||
if (io_error(player->iop) || io_eof(player->iop))
|
||||
player->eof = 1;
|
||||
player->aborted = player->eof = 1;
|
||||
}
|
||||
|
||||
if (player->aborted || player->eof) {
|
||||
if (player->aborted) {
|
||||
player->recvfail++;
|
||||
if (player->recvfail > 255) {
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue