diff options
author | Max Kellermann <max@duempel.org> | 2008-09-10 11:42:26 +0200 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2008-09-10 23:34:54 -0700 |
commit | 70199776b4c925268105df7998905ee36c79846b (patch) | |
tree | a242cf198c0d0b74ca7c98be03d763c0ed8bde94 | |
parent | 6452dab44c6a170d8081b1a15223fb28ea9ab230 (diff) | |
download | mpd-70199776b4c925268105df7998905ee36c79846b.tar.gz mpd-70199776b4c925268105df7998905ee36c79846b.tar.xz mpd-70199776b4c925268105df7998905ee36c79846b.zip |
client: check for COMMAND_RETURN_CLOSE
Don't close the client within client_process_line(), return
COMMAND_RETURN_CLOSE instead. This is the signal for the caller chain
to actually close it. This makes dealing with the client pointer a
lot safer, since the caller always knows whether it is still valid.
-rw-r--r-- | src/client.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/src/client.c b/src/client.c index 9b70116bd..03e9ad0dc 100644 --- a/src/client.c +++ b/src/client.c @@ -342,10 +342,8 @@ static int client_process_line(struct client *client) "list returned %i\n", client->num, ret); if (ret == COMMAND_RETURN_CLOSE || - client_is_expired(client)) { - client_close(client); + client_is_expired(client)) return COMMAND_RETURN_CLOSE; - } if (ret == 0) commandSuccess(client->fd); @@ -367,8 +365,7 @@ static int client_process_line(struct client *client) (unsigned long)client->cmd_list_size, (unsigned long) client_max_command_list_size); - client_close(client); - ret = COMMAND_RETURN_CLOSE; + return COMMAND_RETURN_CLOSE; } else new_cmd_list_ptr(client, line, len); } @@ -388,10 +385,8 @@ static int client_process_line(struct client *client) client->num, ret); if (ret == COMMAND_RETURN_CLOSE || - client_is_expired(client)) { - client_close(client); + client_is_expired(client)) return COMMAND_RETURN_CLOSE; - } if (ret == 0) commandSuccess(client->fd); @@ -422,16 +417,14 @@ static int client_input_received(struct client *client, int bytesRead) if (ret == COMMAND_RETURN_KILL || ret == COMMAND_RETURN_CLOSE) return ret; - if (client_is_expired(client)) - return ret; + assert(!client_is_expired(client)); client->bufferPos = client->bufferLength; } if (client->bufferLength == CLIENT_MAX_BUFFER_LENGTH) { if (client->bufferPos == 0) { ERROR("client %i: buffer overflow\n", client->num); - client_close(client); - return 1; + return COMMAND_RETURN_CLOSE; } if (client->cmd_list_OK >= 0 && client->cmd_list && @@ -461,7 +454,7 @@ static int client_read(struct client *client) if (bytesRead > 0) return client_input_received(client, bytesRead); else if (bytesRead == 0 || (bytesRead < 0 && errno != EINTR)) { - client_close(client); + return COMMAND_RETURN_CLOSE; } else return 0; @@ -530,10 +523,16 @@ int client_manager_io(void) list_for_each_entry_safe(client, n, &clients, siblings) { if (FD_ISSET(client->fd, &rfds)) { - if (COMMAND_RETURN_KILL == - client_read(client)) { + ret = client_read(client); + if (ret == COMMAND_RETURN_KILL) return COMMAND_RETURN_KILL; + if (ret == COMMAND_RETURN_CLOSE) { + client_close(client); + continue; } + + assert(!client_is_expired(client)); + client->lastTime = time(NULL); } if (!client_is_expired(client) && |