From 65a5c85e5531518f3f6d4b28508f8c3183ab775b Mon Sep 17 00:00:00 2001
From: Aki Tuomi <aki.tuomi@dovecot.fi>
Date: Mon, 17 Oct 2016 19:21:34 +0300
Subject: [PATCH] lib-dict: Duplicate result value in mempool

Duplicate the result value already in callback
to avoid it getting lost during async calls.
---
 src/lib-dict/dict-client.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c
index 5388550..830f130 100644
--- a/src/lib-dict/dict-client.c
+++ b/src/lib-dict/dict-client.c
@@ -817,6 +817,7 @@ client_dict_lookup_async(struct dict *_dict, const char *key,
 }
 
 struct client_dict_sync_lookup {
+	pool_t pool;
 	struct dict_lookup_result result;
 	char *error;
 };
@@ -826,9 +827,11 @@ static void client_dict_lookup_callback(const struct dict_lookup_result *result,
 {
 	struct client_dict_sync_lookup *lookup = context;
 
-	lookup->result = *result;
+	lookup->result.ret = result->ret;
 	if (result->ret == -1)
 		lookup->error = i_strdup(result->error);
+	else if (result->ret == 1)
+		lookup->result.value = i_strdup(result->value);
 }
 
 static int client_dict_lookup(struct dict *_dict, pool_t pool, const char *key,
@@ -838,6 +841,7 @@ static int client_dict_lookup(struct dict *_dict, pool_t pool, const char *key,
 
 	memset(&lookup, 0, sizeof(lookup));
 	lookup.result.ret = -2;
+	lookup.pool = pool;
 
 	client_dict_lookup_async(_dict, key, client_dict_lookup_callback, &lookup);
 	if (lookup.result.ret == -2)
@@ -853,6 +857,7 @@ static int client_dict_lookup(struct dict *_dict, pool_t pool, const char *key,
 		return 0;
 	case 1:
 		*value_r = p_strdup(pool, lookup.result.value);
+		i_free(&lookup.result.value);
 		return 1;
 	}
 	i_unreached();
-- 
2.7.4

