[Pkg-gnupg-commit] [gnupg2] 143/180: dirmngr: Use one context for all libdns queries.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Sat Dec 24 22:29:20 UTC 2016


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch master
in repository gnupg2.

commit c4e8a3194d6b92f596a6483e486c645de7d2ddd1
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Dec 16 21:00:14 2016 +0100

    dirmngr: Use one context for all libdns queries.
    
    * dirmngr/dns-stuff.c (libdns_reinit_pending): New var.
    (enable_recursive_resolver): Set var.
    (set_dns_nameserver): Ditto.
    (libdns_init): Avoid double initialization.
    (libdns_deinit): New.
    (reload_dns_stuff): New.
    (libdns_res_open): Act upon LIBDNS_REINIT_PENDING.
    * dirmngr/t-dns-stuff.c (main): Call reload_dns_stuff to release
    memory.
    * dirmngr/dirmngr.c (cleanup): Ditto.
    (dirmngr_sighup_action): Call reload_dns_stuff to set
    LIBDNS_REINIT_PENDING.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 dirmngr/dirmngr.c     |  2 ++
 dirmngr/dns-stuff.c   | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 dirmngr/dns-stuff.h   |  2 ++
 dirmngr/t-dns-stuff.c |  2 +-
 4 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c
index a118327..ef30d2c 100644
--- a/dirmngr/dirmngr.c
+++ b/dirmngr/dirmngr.c
@@ -1383,6 +1383,7 @@ cleanup (void)
 {
   crl_cache_deinit ();
   cert_cache_deinit (1);
+  reload_dns_stuff (1);
 
 #if USE_LDAP
   ldapserver_list_free (opt.ldapservers);
@@ -1689,6 +1690,7 @@ dirmngr_sighup_action (void)
   crl_cache_deinit ();
   cert_cache_init ();
   crl_cache_init ();
+  reload_dns_stuff (0);
 }
 
 
diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c
index 0f1f0ed..63951e5 100644
--- a/dirmngr/dns-stuff.c
+++ b/dirmngr/dns-stuff.c
@@ -133,8 +133,13 @@ struct libdns_s
 
   struct sockaddr_storage socks_host;
 } libdns;
+
+/* If this flag is set, libdns shall be reinited for the next use.  */
+static int libdns_reinit_pending;
+
 #endif /*USE_LIBDNS*/
 
+
 /* Calling this function with YES set to True forces the use of the
  * standard resolver even if dirmngr has been built with support for
  * an alternative resolver.  */
@@ -159,6 +164,7 @@ void
 enable_recursive_resolver (int yes)
 {
   recursive_resolver = yes;
+  libdns_reinit_pending = 1;
 }
 
 
@@ -203,6 +209,7 @@ set_dns_nameserver (const char *ipaddr)
   strncpy (tor_nameserver, ipaddr? ipaddr : DEFAULT_NAMESERVER,
            sizeof tor_nameserver -1);
   tor_nameserver[sizeof tor_nameserver -1] = 0;
+  libdns_reinit_pending = 1;
 }
 
 
@@ -315,6 +322,9 @@ libdns_init (void)
   const char *fname;
   char *cfgstr = NULL;
 
+  if (libdns.resolv_conf)
+    return 0; /* Already initialized.  */
+
   memset (&ld, 0, sizeof ld);
 
   ld.resolv_conf = dns_resconf_open (&derr);
@@ -410,6 +420,41 @@ libdns_init (void)
 
 
 #ifdef USE_LIBDNS
+/* Deinitialize libdns.  */
+static void
+libdns_deinit (void)
+{
+  struct libdns_s ld;
+
+  if (!libdns.resolv_conf)
+    return; /* Not initialized.  */
+
+  ld = libdns;
+  memset (&libdns, 0, sizeof libdns);
+  dns_hints_close (ld.hints);
+  dns_hosts_close (ld.hosts);
+  dns_resconf_close (ld.resolv_conf);
+}
+#endif /*USE_LIBDNS*/
+
+/* SIGHUP action handler for this module.  With FORCE set objects are
+ * all immediately released. */
+void
+reload_dns_stuff (int force)
+{
+  if (force)
+    {
+#ifdef USE_LIBDNS
+      libdns_deinit ();
+#endif
+      libdns_reinit_pending = 0;
+    }
+  else
+    libdns_reinit_pending = 1;
+}
+
+
+#ifdef USE_LIBDNS
 /*
  * Initialize libdns if needed and open a dns_resolver context.
  * Returns 0 on success and stores the new context at R_RES.  On
@@ -424,6 +469,12 @@ libdns_res_open (struct dns_resolver **r_res)
 
   *r_res = NULL;
 
+  if (libdns_reinit_pending)
+    {
+      libdns_reinit_pending = 0;
+      libdns_deinit ();
+    }
+
   err = libdns_init ();
   if (err)
     return err;
diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h
index 20a4b41..2be972a 100644
--- a/dirmngr/dns-stuff.h
+++ b/dirmngr/dns-stuff.h
@@ -116,6 +116,8 @@ gpg_error_t enable_dns_tormode (int new_circuit);
    next DNS query.  Note that this is only used in Tor mode.  */
 void set_dns_nameserver (const char *ipaddr);
 
+/* SIGHUP action handler for this module.  */
+void reload_dns_stuff (int force);
 
 void free_dns_addrinfo (dns_addrinfo_t ai);
 
diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c
index 224e948..5315138 100644
--- a/dirmngr/t-dns-stuff.c
+++ b/dirmngr/t-dns-stuff.c
@@ -217,7 +217,6 @@ main (int argc, char **argv)
         {
           printf ("CNAME found: '%s'\n", cname);
         }
-
       xfree (cname);
     }
   else if (opt_srv)
@@ -291,6 +290,7 @@ main (int argc, char **argv)
       free_dns_addrinfo (aibuf);
     }
 
+  reload_dns_stuff (1); /* Release objects.  */
 
   return 0;
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gnupg2.git



More information about the Pkg-gnupg-commit mailing list