]> 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)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Nov 2018 11:09:56 +0000 (13:09 +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 279b82ce7bd58f4109c66ee28379283739e968e5..cbb9eb6327b76857b9a0c5d96acf0bef8b5e467e 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)