[mpd] remove idle client if an eof or error occurred on the event buffer

(fixes segfault after closing the connection of an mpd client)
This commit is contained in:
chme 2015-04-11 14:22:15 +02:00
parent 600e48842f
commit e156181121
1 changed files with 18 additions and 4 deletions

View File

@ -670,8 +670,8 @@ mpd_command_idle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
return 0; return 0;
} }
static int static void
mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg) mpd_remove_idle_client(struct evbuffer *evbuf)
{ {
struct idle_client *client; struct idle_client *client;
struct idle_client *prev; struct idle_client *prev;
@ -683,7 +683,7 @@ mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{ {
if (client->evbuffer == evbuf) if (client->evbuffer == evbuf)
{ {
DPRINTF(E_DBG, L_MPD, "Found idle client for noidle command\n"); DPRINTF(E_DBG, L_MPD, "Removing idle client for evbuffer\n");
if (prev) if (prev)
prev->next = client->next; prev->next = client->next;
@ -697,7 +697,12 @@ mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
prev = client; prev = client;
client = client->next; client = client->next;
} }
}
static int
mpd_command_noidle(struct evbuffer *evbuf, int argc, char **argv, char **errmsg)
{
mpd_remove_idle_client(evbuf);
return 0; return 0;
} }
@ -3675,12 +3680,21 @@ mpd_read_cb(struct bufferevent *bev, void *ctx)
static void static void
mpd_event_cb(struct bufferevent *bev, short events, void *ctx) mpd_event_cb(struct bufferevent *bev, short events, void *ctx)
{ {
struct evbuffer *evbuf;
if (events & BEV_EVENT_ERROR) if (events & BEV_EVENT_ERROR)
DPRINTF(E_LOG, L_MPD, "Error from buffer event\n"); {
DPRINTF(E_LOG, L_MPD, "Error from bufferevent: %s\n",
evutil_socket_error_to_string(EVUTIL_SOCKET_ERROR()));
}
if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR))
{
evbuf = bufferevent_get_output(bev);
mpd_remove_idle_client(evbuf);
bufferevent_free(bev); bufferevent_free(bev);
} }
}
/* /*
* The input filter buffer callback checks if the data received from the client is a complete command sequence. * The input filter buffer callback checks if the data received from the client is a complete command sequence.