]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dns: Initialize lookup earlier
authorAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 17 Aug 2018 11:36:13 +0000 (14:36 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Nov 2018 13:09:32 +0000 (15:09 +0200)
src/lib-dns/dns-lookup.c

index cdc86547c94aac3adce2bc4fb0e5cdc8f5f1136b..d351af29f1566e7aa3973d70854585211a0d2ce4 100644 (file)
@@ -350,40 +350,43 @@ dns_client_lookup_common(struct dns_client *client,
                         dns_lookup_callback_t *callback, void *context,
                         struct dns_lookup **lookup_r)
 {
-       struct dns_lookup *lookup;
-       struct dns_lookup_result result;
+       struct dns_lookup tlookup, *lookup;
        int ret;
 
-       i_zero(&result);
-       result.ret = EAI_FAIL;
        i_assert(param != NULL && *param != '\0');
        cmd = t_strdup_printf("%s\t%s\n", cmd, param);
 
-       if ((ret = dns_client_send_request(client, cmd, &result.error)) <= 0) {
+       i_zero(&tlookup);
+       lookup = &tlookup;
+
+       if (gettimeofday(&lookup->start_time, NULL) < 0)
+               i_fatal("gettimeofday() failed: %m");
+
+       lookup->client = client;
+       lookup->callback = callback;
+       lookup->context = context;
+       lookup->ptr_lookup = ptr_lookup;
+       lookup->result.ret = EAI_FAIL;
+
+       if ((ret = dns_client_send_request(client, cmd, &lookup->result.error)) <= 0) {
                if (ret == 0) {
                        /* retry once */
-                       ret = dns_client_send_request(client, cmd, &result.error);
+                       ret = dns_client_send_request(client, cmd,
+                                                     &lookup->result.error);
                }
                if (ret <= 0) {
-                       callback(&result, context);
+                       callback(&lookup.result, context);
                        return -1;
                }
        }
 
        lookup = i_new(struct dns_lookup, 1);
-       lookup->client = client;
-       lookup->ptr_lookup = ptr_lookup;
+       *lookup = tlookup;
        if (client->timeout_msecs != 0) {
                lookup->to = timeout_add_to(client->ioloop,
                                            client->timeout_msecs,
                                            dns_lookup_timeout, lookup);
        }
-       lookup->result.ret = EAI_FAIL;
-       lookup->callback = callback;
-       lookup->context = context;
-       if (gettimeofday(&lookup->start_time, NULL) < 0)
-               i_fatal("gettimeofday() failed: %m");
-
        timeout_remove(&client->to_idle);
        DLLIST2_APPEND(&client->head, &client->tail, lookup);
        *lookup_r = lookup;