[Pkg-gnupg-commit] [gnupg2] 45/116: dirmngr: Change internal SRV lookup API.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Tue Jan 24 04:40:52 UTC 2017


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

dkg pushed a commit to branch master
in repository gnupg2.

commit 16078f3deea5b82ea26e2f01dbd3ef3a5ce25410
Author: Werner Koch <wk at gnupg.org>
Date:   Sun Jan 8 18:04:59 2017 +0100

    dirmngr: Change internal SRV lookup API.
    
    * dirmngr/dns-stuff.c (get_dns_srv): Add args SERVICE and PROTO.
    * dirmngr/http.c (connect_server): Simplify SRV lookup.
    * dirmngr/ks-engine-hkp.c (map_host): Ditto.
    * dirmngr/t-dns-stuff.c (main): Adjust for changed get_dns_srv.
    --
    
    This new API is more convenient because it includes commonly used
    code.  Note that right now http.c's SRV record code is not used.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 dirmngr/dns-stuff.c     | 25 +++++++++++++++++++++++--
 dirmngr/dns-stuff.h     |  1 +
 dirmngr/http.c          | 28 +++++-----------------------
 dirmngr/ks-engine-hkp.c | 12 +-----------
 dirmngr/t-dns-stuff.c   |  2 +-
 5 files changed, 31 insertions(+), 37 deletions(-)

diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c
index 028b065..a8713eb 100644
--- a/dirmngr/dns-stuff.c
+++ b/dirmngr/dns-stuff.c
@@ -1740,17 +1740,37 @@ getsrv_standard (const char *name,
 }
 
 
-/* Note that we do not return NONAME but simply store 0 at R_COUNT.  */
+/* Query a SRV record for SERVICE and PROTO for NAME.  If SERVICE is
+ * NULL, NAME is expected to contain the full query name.  Note that
+ * we do not return NONAME but simply store 0 at R_COUNT.  On error an
+ * error code is returned and 0 stored at R_COUNT.  */
 gpg_error_t
-get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count)
+get_dns_srv (const char *name, const char *service, const char *proto,
+             struct srventry **list, unsigned int *r_count)
 {
   gpg_error_t err;
+  char *namebuffer = NULL;
   unsigned int srvcount;
   int i;
 
   *list = NULL;
   *r_count = 0;
   srvcount = 0;
+
+  /* If SERVICE is given construct the query from it and PROTO.  */
+  if (service)
+    {
+      namebuffer = xtryasprintf ("_%s._%s.%s",
+                                 service, proto? proto:"tcp", name);
+      if (!namebuffer)
+        {
+          err = gpg_error_from_syserror ();
+          goto leave;
+        }
+      name = namebuffer;
+    }
+
+
 #ifdef USE_LIBDNS
   if (!standard_resolver)
     {
@@ -1852,6 +1872,7 @@ get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count)
     }
   if (!err)
     *r_count = srvcount;
+  xfree (namebuffer);
   return err;
 }
 
diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h
index eb7fe72..d68dd17 100644
--- a/dirmngr/dns-stuff.h
+++ b/dirmngr/dns-stuff.h
@@ -153,6 +153,7 @@ gpg_error_t get_dns_cert (const char *name, int want_certtype,
 
 /* Return an array of SRV records.  */
 gpg_error_t get_dns_srv (const char *name,
+                         const char *service, const char *proto,
                          struct srventry **list, unsigned int *r_count);
 
 
diff --git a/dirmngr/http.c b/dirmngr/http.c
index 14d60df..7a02804 100644
--- a/dirmngr/http.c
+++ b/dirmngr/http.c
@@ -2362,29 +2362,11 @@ connect_server (const char *server, unsigned short port,
   /* Do the SRV thing */
   if (srvtag)
     {
-      /* We're using SRV, so append the tags. */
-      if (1 + strlen (srvtag) + 6 + strlen (server) + 1
-          <= DIMof (struct srventry, target))
-	{
-	  char *srvname = xtrymalloc (DIMof (struct srventry, target));
-
-          if (!srvname) /* Out of core */
-            {
-              serverlist = NULL;
-              srvcount = 0;
-            }
-          else
-            {
-              stpcpy (stpcpy (stpcpy (stpcpy (srvname,"_"), srvtag),
-                              "._tcp."), server);
-              err = get_dns_srv (srvname, &serverlist, &srvcount);
-              if (err)
-                log_info ("getting SRV '%s' failed: %s\n",
-                          srvname, gpg_strerror (err));
-              xfree (srvname);
-              /* Note that on error SRVCOUNT is zero.  */
-            }
-	}
+      err = get_dns_srv (server, srvtag, NULL, &serverlist, &srvcount);
+      if (err)
+        log_info ("getting '%s' SRV for '%s' failed: %s\n",
+                  srvtag, server, gpg_strerror (err));
+      /* Note that on error SRVCOUNT is zero.  */
     }
 
   if (!serverlist)
diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c
index a6c22f8..283e805 100644
--- a/dirmngr/ks-engine-hkp.c
+++ b/dirmngr/ks-engine-hkp.c
@@ -426,7 +426,6 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect,
       int refidx;
       int is_pool = 0;
       char *cname;
-      char *srvrecord;
       struct srventry *srvs;
       unsigned int srvscount;
 
@@ -448,16 +447,7 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect,
       if (!is_ip_address (name))
         {
           /* Check for SRV records.  */
-          srvrecord = xtryasprintf ("_hkp._tcp.%s", name);
-          if (srvrecord == NULL)
-            {
-              err = gpg_error_from_syserror ();
-              xfree (reftbl);
-              return err;
-            }
-
-          err = get_dns_srv (srvrecord, &srvs, &srvscount);
-          xfree (srvrecord);
+          err = get_dns_srv (name, "hkp", NULL, &srvs, &srvscount);
           if (err)
             {
               xfree (reftbl);
diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c
index bc4ca9a..23c0c6a 100644
--- a/dirmngr/t-dns-stuff.c
+++ b/dirmngr/t-dns-stuff.c
@@ -235,7 +235,7 @@ main (int argc, char **argv)
       int i;
 
       err = get_dns_srv (name? name : "_hkp._tcp.wwwkeys.pgp.net",
-                         &srv, &count);
+                         NULL, NULL, &srv, &count);
       if (err)
         printf ("get_dns_srv failed: %s <%s>\n",
                 gpg_strerror (err), gpg_strsource (err));

-- 
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