]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-client: Fixed error message for failed synchronous dict_lookup()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 5 Aug 2016 19:57:02 +0000 (22:57 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 8 Aug 2016 10:29:15 +0000 (13:29 +0300)
The error message was allocated from data stack, but freed too early.

src/lib-dict/dict-client.c

index 504ed9f0a83f3fad4548758d68cdb7aaddba05b6..fb694953afc8bf4d4ca7f4e73b7f5c1f6364c466 100644 (file)
@@ -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();