From: Timo Sirainen Date: Tue, 13 Jun 2017 14:18:17 +0000 (+0300) Subject: lib-master: anvil_client_query() delay calling callback on failures X-Git-Tag: 2.3.0.rc1~1412 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0dc3c49bc97e425c1d30664d800be17af078c2d4;p=thirdparty%2Fdovecot%2Fcore.git lib-master: anvil_client_query() delay calling callback on failures This fixes crash in lmtp on anvil connect failure where the callback wasn't expecting to be called so early. --- diff --git a/src/lib-master/anvil-client.c b/src/lib-master/anvil-client.c index e1c7bd1fcd..5d34030b13 100644 --- a/src/lib-master/anvil-client.c +++ b/src/lib-master/anvil-client.c @@ -229,16 +229,19 @@ anvil_client_query(struct anvil_client *client, const char *query, { struct anvil_query *anvil_query; - if (anvil_client_send(client, query) < 0) { - callback(NULL, context); - return NULL; - } - anvil_query = i_new(struct anvil_query, 1); anvil_query->callback = callback; anvil_query->context = context; aqueue_append(client->queries, &anvil_query); - if (client->to_query == NULL) { + if (anvil_client_send(client, query) < 0) { + /* connection failure. add a delayed failure callback. + the caller may not expect the callback to be called + immediately. */ + if (client->to_query != NULL) + timeout_remove(&client->to_query); + client->to_query = + timeout_add_short(0, anvil_client_cancel_queries, client); + } else if (client->to_query == NULL) { client->to_query = timeout_add(ANVIL_QUERY_TIMEOUT_MSECS, anvil_client_timeout, client); }