]> 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>
Fri, 5 Aug 2016 19:57:02 +0000 (22:57 +0300)
The error message was allocated from data stack, but freed too early.

src/lib-dict/dict-client.c

index 045adf6f9469df0c6d4a214bb66de7eb2695dbca..fcdc64392d3f525f01d8ea10858b4598b8a9b528 100644 (file)
@@ -744,35 +744,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, const char **error_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:
-               *error_r = result.error;
+               *error_r = t_strdup(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();