]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: ipc-client: Don't call callback twice if IPC proxy sends invalid input
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 5 Jul 2018 10:40:43 +0000 (13:40 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 25 Jan 2019 10:47:18 +0000 (12:47 +0200)
ipc_client_disconnect() called it once, and the second time was done with
the cmds[0] that was already removed from the array.

src/lib-master/ipc-client.c

index cb26fdbda471892d5ea7a4f7770a874c7ccf724e..3d4529c65654ec24470908074f528ff6ae3462fe 100644 (file)
@@ -36,6 +36,7 @@ static void ipc_client_input_line(struct ipc_client *client, const char *line)
        const struct ipc_client_cmd *cmds;
        unsigned int count;
        enum ipc_client_cmd_state state;
+       bool disconnect = FALSE;
 
        cmds = array_get(&client->cmds, &count);
        if (count == 0) {
@@ -56,7 +57,7 @@ static void ipc_client_input_line(struct ipc_client *client, const char *line)
        default:
                i_error("IPC proxy sent invalid input: %s", line);
                line = "Invalid input";
-               ipc_client_disconnect(client);
+               disconnect = TRUE;
                state = IPC_CLIENT_CMD_STATE_ERROR;
                break;
        }
@@ -64,6 +65,8 @@ static void ipc_client_input_line(struct ipc_client *client, const char *line)
        cmds[0].callback(state, line, cmds[0].context);
        if (state != IPC_CLIENT_CMD_STATE_REPLY)
                array_delete(&client->cmds, 0, 1);
+       if (disconnect)
+               ipc_client_disconnect(client);
 }
 
 static void ipc_client_input(struct ipc_client *client)