# HG changeset patch # User Timo Sirainen # Date 1191626216 -10800 # Node ID d747bfbda43c313425a4517a188e6bae5d2f0915 # Parent 2f397bc2cc0c4a57dbc9f07861c798ad6ee7e591 Fixed process hanging sometimes when disconnecting. diff -r 2f397bc2cc0c -r d747bfbda43c src/imap/client.c --- a/src/imap/client.c Sat Oct 06 01:50:52 2007 +0300 +++ b/src/imap/client.c Sat Oct 06 02:16:56 2007 +0300 @@ -441,14 +441,18 @@ } } -void client_continue_pending_input(struct client *client) +void client_continue_pending_input(struct client **_client) { + struct client *client = *_client; size_t size; i_assert(!client->handling_input); - if (client->disconnected) + if (client->disconnected) { + client_destroy(client, NULL); + *_client = NULL; return; + } if (client->input_lock != NULL) { /* there's a command that has locked the input */ @@ -688,7 +692,7 @@ client_destroy(client, NULL); return 1; } else { - client_continue_pending_input(client); + client_continue_pending_input(&client); } return ret; } diff -r 2f397bc2cc0c -r d747bfbda43c src/imap/client.h --- a/src/imap/client.h Sat Oct 06 01:50:52 2007 +0300 +++ b/src/imap/client.h Sat Oct 06 02:16:56 2007 +0300 @@ -106,7 +106,7 @@ void client_command_cancel(struct client_command_context *cmd); void client_command_free(struct client_command_context *cmd); -void client_continue_pending_input(struct client *client); +void client_continue_pending_input(struct client **_client); void client_input(struct client *client); int client_output(struct client *client); diff -r 2f397bc2cc0c -r d747bfbda43c src/imap/cmd-append.c --- a/src/imap/cmd-append.c Sat Oct 06 01:50:52 2007 +0300 +++ b/src/imap/cmd-append.c Sat Oct 06 02:16:56 2007 +0300 @@ -76,7 +76,7 @@ if (cmd->func(cmd)) { o_stream_uncork(client->output); client_command_free(cmd); - client_continue_pending_input(client); + client_continue_pending_input(&client); } } diff -r 2f397bc2cc0c -r d747bfbda43c src/imap/cmd-idle.c --- a/src/imap/cmd-idle.c Sat Oct 06 01:50:52 2007 +0300 +++ b/src/imap/cmd-idle.c Sat Oct 06 02:16:56 2007 +0300 @@ -55,7 +55,7 @@ o_stream_uncork(client->output); if (free_cmd) client_command_free(ctx->cmd); - client_continue_pending_input(client); + client_continue_pending_input(&client); } static void idle_client_input(struct cmd_idle_context *ctx) diff -r 2f397bc2cc0c -r d747bfbda43c src/imap/cmd-search.c --- a/src/imap/cmd-search.c Sat Oct 06 01:50:52 2007 +0300 +++ b/src/imap/cmd-search.c Sat Oct 06 02:16:56 2007 +0300 @@ -114,7 +114,7 @@ if (finished) { client_command_free(cmd); - client_continue_pending_input(client); + client_continue_pending_input(&client); } else { if (cmd->output_pending) o_stream_set_flush_pending(client->output, TRUE);