From: Timo Sirainen Date: Fri, 5 Aug 2016 19:57:02 +0000 (+0300) Subject: dict-client: Fixed error message for failed synchronous dict_lookup() X-Git-Tag: 2.2.26~411 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=847a3da99d29718903184bcb62952983f6885133;p=thirdparty%2Fdovecot%2Fcore.git dict-client: Fixed error message for failed synchronous dict_lookup() The error message was allocated from data stack, but freed too early. --- diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c index 504ed9f0a8..fb694953af 100644 --- a/src/lib-dict/dict-client.c +++ b/src/lib-dict/dict-client.c @@ -745,35 +745,43 @@ client_dict_lookup_async(struct dict *_dict, const char *key, client_dict_cmd_send(dict, &cmd, NULL); } +struct client_dict_sync_lookup { + struct dict_lookup_result result; + char *error; +}; + static void client_dict_lookup_callback(const struct dict_lookup_result *result, void *context) { - struct dict_lookup_result *result_copy = context; + struct client_dict_sync_lookup *lookup = context; - *result_copy = *result; + lookup->result = *result; + if (result->ret == -1) + lookup->error = i_strdup(result->error); } static int client_dict_lookup(struct dict *_dict, pool_t pool, const char *key, const char **value_r) { - struct dict_lookup_result result; + struct client_dict_sync_lookup lookup; - memset(&result, 0, sizeof(result)); - result.ret = -2; + memset(&lookup, 0, sizeof(lookup)); + lookup.result.ret = -2; - client_dict_lookup_async(_dict, key, client_dict_lookup_callback, &result); - if (result.ret == -2) + client_dict_lookup_async(_dict, key, client_dict_lookup_callback, &lookup); + if (lookup.result.ret == -2) client_dict_wait(_dict); - switch (result.ret) { + switch (lookup.result.ret) { case -1: - i_error("dict-client: Lookup '%s' failed: %s", key, result.error); + i_error("dict-client: Lookup '%s' failed: %s", key, lookup.error); + i_free(lookup.error); return -1; case 0: *value_r = NULL; return 0; case 1: - *value_r = p_strdup(pool, result.value); + *value_r = p_strdup(pool, lookup.result.value); return 1; } i_unreached();