DNS: explicit alloc/free of workspace
[exim.git] / src / src / lookups / dnsdb.c
index a842d0d0c6503456b998f9c1f9e6242ecaedd535..8422833c4c48078311e5c426c7e2bf62751dc214 100644 (file)
@@ -3,6 +3,7 @@
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2020 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 #include "../exim.h"
@@ -79,8 +80,6 @@ static int type_values[] = {
 static void *
 dnsdb_open(const uschar * filename, uschar **errmsg)
 {
-filename = filename;   /* Keep picky compilers happy */
-errmsg = errmsg;       /* Ditto */
 return (void *)(-1);   /* Any non-0 value */
 }
 
@@ -154,11 +153,6 @@ store as possible later, so we preallocate the result here */
 
 gstring * yield = string_get(256);
 
-handle = handle;           /* Keep picky compilers happy */
-filename = filename;
-length = length;
-do_cache = do_cache;
-
 /* If the string starts with '>' we change the output separator.
 If it's followed by ';' or ',' we set the TXT output separator. */
 
@@ -196,7 +190,8 @@ for (;;)
     else
       {
       *errmsg = US"unsupported dnsdb defer behaviour";
-      return DEFER;
+      rc = DEFER;
+      goto out;
       }
     }
   else if (strncmpic(keystring, US"dnssec_", 7) == 0)
@@ -211,7 +206,8 @@ for (;;)
     else
       {
       *errmsg = US"unsupported dnsdb dnssec behaviour";
-      return DEFER;
+      rc = DEFER;
+      goto out;
       }
     }
   else if (strncmpic(keystring, US"retrans_", 8) == 0)
@@ -220,7 +216,8 @@ for (;;)
     if ((timeout_sec = readconf_readtime(keystring += 8, ',', FALSE)) <= 0)
       {
       *errmsg = US"unsupported dnsdb timeout value";
-      return DEFER;
+      rc = DEFER;
+      goto out;
       }
     dns_retrans = timeout_sec;
     while (*keystring != ',') keystring++;
@@ -231,7 +228,8 @@ for (;;)
     if ((retries = (int)strtol(CCS keystring + 6, CSS &keystring, 0)) < 0)
       {
       *errmsg = US"unsupported dnsdb retry count";
-      return DEFER;
+      rc = DEFER;
+      goto out;
       }
     dns_retry = retries;
     }
@@ -242,7 +240,8 @@ for (;;)
   if (*keystring++ != ',')
     {
     *errmsg = US"dnsdb modifier syntax error";
-    return DEFER;
+    rc = DEFER;
+    goto out;
     }
   while (isspace(*keystring)) keystring++;
   }
@@ -270,7 +269,8 @@ if ((equals = Ustrchr(keystring, '=')) != NULL)
   if (i >= nelem(type_names))
     {
     *errmsg = US"unsupported DNS record type";
-    return DEFER;
+    rc = DEFER;
+    goto out;
     }
 
   keystring = equals + 1;
@@ -365,7 +365,8 @@ while ((domain = string_nextinlist(&keystring, &sep, NULL, 0)))
        dns_retrans = save_retrans;
        dns_retry = save_retry;
        dns_init(FALSE, FALSE, FALSE);                  /* clr dnssec bit */
-       return DEFER;                                   /* always defer */
+       rc = DEFER;                                     /* always defer */
+       goto out;
        }
       if (defer_mode == PASS) failrc = DEFER;         /* defer only if all do */
       continue;                                       /* treat defer as fail */
@@ -555,10 +556,18 @@ dns_retrans = save_retrans;
 dns_retry = save_retry;
 dns_init(FALSE, FALSE, FALSE); /* clear the dnssec bit for getaddrbyname */
 
-if (!yield || !yield->ptr) return failrc;
+if (!yield || !yield->ptr)
+  rc = failrc;
+else
+  {
+  *result = string_from_gstring(yield);
+  rc = OK;
+  }
+
+out:
 
-*result = string_from_gstring(yield);
-return OK;
+store_free_dns_answer(dnsa);
+return rc;
 }
 
 
@@ -581,15 +590,15 @@ fprintf(f, "Library version: DNSDB: Exim version %s\n", EXIM_VERSION_STR);
 
 
 static lookup_info _lookup_info = {
-  US"dnsdb",                     /* lookup name */
-  lookup_querystyle,             /* query style */
-  dnsdb_open,                    /* open function */
-  NULL,                          /* check function */
-  dnsdb_find,                    /* find function */
-  NULL,                          /* no close function */
-  NULL,                          /* no tidy function */
-  NULL,                          /* no quoting function */
-  dnsdb_version_report           /* version reporting */
+  .name = US"dnsdb",                   /* lookup name */
+  .type = lookup_querystyle,           /* query style */
+  .open = dnsdb_open,                  /* open function */
+  .check = NULL,                       /* check function */
+  .find = dnsdb_find,                  /* find function */
+  .close = NULL,                       /* no close function */
+  .tidy = NULL,                                /* no tidy function */
+  .quote = NULL,                       /* no quoting function */
+  .version_report = dnsdb_version_report           /* version reporting */
 };
 
 #ifdef DYNLOOKUP