DNS: explicit alloc/free of workspace
[exim.git] / src / src / lookups / dnsdb.c
index 1985964da325140399cda146554b10ae30177236..8422833c4c48078311e5c426c7e2bf62751dc214 100644 (file)
@@ -80,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 */
 }
 
@@ -155,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. */
 
@@ -197,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)
@@ -212,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)
@@ -221,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++;
@@ -232,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;
     }
@@ -243,7 +240,8 @@ for (;;)
   if (*keystring++ != ',')
     {
     *errmsg = US"dnsdb modifier syntax error";
-    return DEFER;
+    rc = DEFER;
+    goto out;
     }
   while (isspace(*keystring)) keystring++;
   }
@@ -271,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;
@@ -366,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 */
@@ -556,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;
 }