[git] GnuPG - branch, master, updated. gnupg-2.1.0-54-g2f90b7c

by Werner Koch cvs at cvs.gnupg.org
Mon Dec 1 10:44:46 CET 2014


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".

The branch, master has been updated
       via  2f90b7c21b2f84ca2bf5f4555da9233e84606b4e (commit)
       via  eede0e59bf6281777da7391752ae4191f3e51204 (commit)
       via  cdd451d5c2bdd7e157edfee6e9b2b327a86ddeae (commit)
      from  e1f515b19c7f63b6d0b0253319b9fc41dabed657 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 2f90b7c21b2f84ca2bf5f4555da9233e84606b4e
Author: Werner Koch <wk at gnupg.org>
Date:   Mon Dec 1 10:45:06 2014 +0100

    scd: Implement socket redirection.
    
    * scd/scdaemon.c (ENAMETOOLONG): New.
    (redir_socket_name): New.
    (cleanup): Take care of a redirected socket.
    (main): Pass redir_socket_name to create_server_socket.
    (create_socket_name): Remove superfluous length check.
    (create_server_socket): Add arg r_redir_name and implement
    redirection.  Replace assert for older Assuan by an error message.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 7576cf9..de40e3b 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -1525,8 +1525,8 @@ create_socket_name (char *standard_name, int with_homedir)
 /* Create a Unix domain socket with NAME.  Returns the file descriptor
    or terminates the process in case of an error.  Note that this
    function needs to be used for the regular socket first (indicated
-   by PRIMARY) and only then for the extra and the ssh sockets.  if
-   the soecket has been redirected the name of the real socket is
+   by PRIMARY) and only then for the extra and the ssh sockets.  If
+   the socket has been redirected the name of the real socket is
    stored as a malloced string at R_REDIR_NAME.  */
 static gnupg_fd_t
 create_server_socket (char *name, int primary,
diff --git a/scd/scdaemon.c b/scd/scdaemon.c
index 77b6283..763ce2d 100644
--- a/scd/scdaemon.c
+++ b/scd/scdaemon.c
@@ -55,6 +55,9 @@
 #include "asshelp.h"
 #include "../common/init.h"
 
+#ifndef ENAMETOOLONG
+# define ENAMETOOLONG EINVAL
+#endif
 
 enum cmd_and_opt_values
 { aNull = 0,
@@ -194,6 +197,8 @@ static int pipe_server;
 
 /* Name of the communication socket */
 static char *socket_name;
+/* Name of the redirected socket or NULL.  */
+static char *redir_socket_name;
 
 /* We need to keep track of the server's nonces (these are dummies for
    POSIX systems). */
@@ -207,6 +212,7 @@ static int ticker_disabled;
 

 static char *create_socket_name (char *standard_name);
 static gnupg_fd_t create_server_socket (const char *name,
+                                        char **r_redir_name,
                                         assuan_sock_nonce_t *nonce);
 
 static void *start_connection_thread (void *arg);
@@ -357,14 +363,17 @@ cleanup (void)
 {
   if (socket_name && *socket_name)
     {
+      char *name;
       char *p;
 
-      remove (socket_name);
-      p = strrchr (socket_name, '/');
+      name = redir_socket_name? redir_socket_name : socket_name;
+
+      gnupg_remove (name);
+      p = strrchr (name, '/');
       if (p)
         {
           *p = 0;
-          rmdir (socket_name);
+          rmdir (name);
           *p = '/';
         }
       *socket_name = 0;
@@ -736,7 +745,8 @@ main (int argc, char **argv )
       if (multi_server)
         {
           socket_name = create_socket_name (SCDAEMON_SOCK_NAME);
-          fd = FD2INT(create_server_socket (socket_name, &socket_nonce));
+          fd = FD2INT(create_server_socket (socket_name,
+                                            &redir_socket_name, &socket_nonce));
         }
 
       res = npth_attr_init (&tattr);
@@ -788,7 +798,8 @@ main (int argc, char **argv )
 
       /* Create the socket.  */
       socket_name = create_socket_name (SCDAEMON_SOCK_NAME);
-      fd = FD2INT (create_server_socket (socket_name, &socket_nonce));
+      fd = FD2INT (create_server_socket (socket_name,
+                                         &redir_socket_name, &socket_nonce));
 
 
       fflush (NULL);
@@ -1025,26 +1036,28 @@ create_socket_name (char *standard_name)
       log_error (("'%s' are not allowed in the socket name\n"), PATHSEP_S);
       scd_exit (2);
     }
-  if (strlen (name) + 1 >= DIMof (struct sockaddr_un, sun_path) )
-    {
-      log_error (_("name of socket too long\n"));
-      scd_exit (2);
-    }
   return name;
 }
 
 
 
 /* Create a Unix domain socket with NAME.  Returns the file descriptor
-   or terminates the process in case of an error. */
+   or terminates the process in case of an error.  If the socket has
+   been redirected the name of the real socket is stored as a malloced
+   string at R_REDIR_NAME. */
 static gnupg_fd_t
-create_server_socket (const char *name, assuan_sock_nonce_t *nonce)
+create_server_socket (const char *name, char **r_redir_name,
+                      assuan_sock_nonce_t *nonce)
 {
-  struct sockaddr_un *serv_addr;
+  struct sockaddr *addr;
+  struct sockaddr_un *unaddr;
   socklen_t len;
   gnupg_fd_t fd;
   int rc;
 
+  xfree (*r_redir_name);
+  *r_redir_name = NULL;
+
   fd = assuan_sock_new (AF_UNIX, SOCK_STREAM, 0);
   if (fd == GNUPG_INVALID_FD)
     {
@@ -1052,26 +1065,55 @@ create_server_socket (const char *name, assuan_sock_nonce_t *nonce)
       scd_exit (2);
     }
 
-  serv_addr = xmalloc (sizeof (*serv_addr));
-  memset (serv_addr, 0, sizeof *serv_addr);
-  serv_addr->sun_family = AF_UNIX;
-  assert (strlen (name) + 1 < sizeof (serv_addr->sun_path));
-  strcpy (serv_addr->sun_path, name);
-  len = SUN_LEN (serv_addr);
+  unaddr = xmalloc (sizeof (*unaddr));
+  addr = (struct sockaddr*)unaddr;
+
+#if ASSUAN_VERSION_NUMBER >= 0x020104 /* >= 2.1.4 */
+  {
+    int redirected;
+
+    if (assuan_sock_set_sockaddr_un (name, addr, &redirected))
+      {
+        if (errno == ENAMETOOLONG)
+          log_error (_("socket name '%s' is too long\n"), name);
+        else
+          log_error ("error preparing socket '%s': %s\n",
+                     name, gpg_strerror (gpg_error_from_syserror ()));
+        scd_exit (2);
+      }
+    if (redirected)
+      {
+        *r_redir_name = xstrdup (unaddr->sun_path);
+        if (opt.verbose)
+          log_info ("redirecting socket '%s' to '%s'\n", name, *r_redir_name);
+      }
+  }
+#else /* Assuan < 2.1.4 */
+  memset (unaddr, 0, sizeof *unaddr);
+  unaddr->sun_family = AF_UNIX;
+  if (strlen (name) + 1 >= sizeof (unaddr->sun_path))
+    {
+      log_error (_("socket name '%s' is too long\n"), name);
+      scd_exit (2);
+    }
+  strcpy (unaddr->sun_path, name);
+#endif /* Assuan < 2.1.4 */
+
+  len = SUN_LEN (unaddr);
 
-  rc = assuan_sock_bind (fd, (struct sockaddr*) serv_addr, len);
+  rc = assuan_sock_bind (fd, addr, len);
   if (rc == -1 && errno == EADDRINUSE)
     {
-      remove (name);
-      rc = assuan_sock_bind (fd, (struct sockaddr*) serv_addr, len);
+      gnupg_remove (unaddr->sun_path);
+      rc = assuan_sock_bind (fd, addr, len);
     }
   if (rc != -1
-      && (rc=assuan_sock_get_nonce ((struct sockaddr*)serv_addr, len, nonce)))
+      && (rc=assuan_sock_get_nonce (addr, len, nonce)))
     log_error (_("error getting nonce for the socket\n"));
  if (rc == -1)
     {
       log_error (_("error binding socket to '%s': %s\n"),
-		 serv_addr->sun_path,
+		 unaddr->sun_path,
                  gpg_strerror (gpg_error_from_syserror ()));
       assuan_sock_close (fd);
       scd_exit (2);
@@ -1086,7 +1128,7 @@ create_server_socket (const char *name, assuan_sock_nonce_t *nonce)
     }
 
   if (opt.verbose)
-    log_info (_("listening on socket '%s'\n"), serv_addr->sun_path);
+    log_info (_("listening on socket '%s'\n"), unaddr->sun_path);
 
   return fd;
 }

commit eede0e59bf6281777da7391752ae4191f3e51204
Author: Werner Koch <wk at gnupg.org>
Date:   Mon Dec 1 09:50:55 2014 +0100

    dirmngr: Implement socket redirection.
    
    * dirmngr/dirmngr.c (ENAMETOOLONG): new.
    (redir_socket_name): New.
    (main): Add Assuan socket redirection.
    (cleanup): Adjust cleanup for redirection.
    --
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c
index 95f9058..d3424c1 100644
--- a/dirmngr/dirmngr.c
+++ b/dirmngr/dirmngr.c
@@ -79,6 +79,10 @@
 # define USE_W32_SERVICE 1
 #endif
 
+#ifndef ENAMETOOLONG
+# define ENAMETOOLONG EINVAL
+#endif
+
 
 enum cmd_and_opt_values {
   aNull = 0,
@@ -237,8 +241,11 @@ static ARGPARSE_OPTS opts[] = {
 #define DEFAULT_MAX_REPLIES 10
 #define DEFAULT_LDAP_TIMEOUT 100 /* arbitrary large timeout */
 
-/* For the cleanup handler we need to keep track of the socket's name. */
+/* For the cleanup handler we need to keep track of the socket's name.  */
 static const char *socket_name;
+/* If the socket has been redirected, this is the name of the
+   redirected socket..  */
+static const char *redir_socket_name;
 
 /* We need to keep track of the server's nonces (these are dummies for
    POSIX systems). */
@@ -1047,12 +1054,6 @@ main (int argc, char **argv)
           dirmngr_exit (1);
         }
 #endif
-      if (strlen (socket_name)+1 >= sizeof serv_addr.sun_path )
-        {
-          log_error (_("name of socket too long\n"));
-          dirmngr_exit (1);
-        }
-
       fd = assuan_sock_new (AF_UNIX, SOCK_STREAM, 0);
       if (fd == ASSUAN_INVALID_FD)
         {
@@ -1061,9 +1062,41 @@ main (int argc, char **argv)
           dirmngr_exit (1);
         }
 
+#if ASSUAN_VERSION_NUMBER >= 0x020104 /* >= 2.1.4 */
+      {
+        int redirected;
+
+        if (assuan_sock_set_sockaddr_un (socket_name,
+                                         (struct sockaddr*)&serv_addr,
+                                         &redirected))
+          {
+            if (errno == ENAMETOOLONG)
+              log_error (_("socket name '%s' is too long\n"), socket_name);
+            else
+              log_error ("error preparing socket '%s': %s\n",
+                         socket_name,
+                         gpg_strerror (gpg_error_from_syserror ()));
+            dirmngr_exit (1);
+          }
+        if (redirected)
+          {
+            redir_socket_name = xstrdup (serv_addr.sun_path);
+            if (opt.verbose)
+              log_info ("redirecting socket '%s' to '%s'\n",
+                        socket_name, redir_socket_name);
+          }
+      }
+#else /* Assuan < 2.1.4 */
       memset (&serv_addr, 0, sizeof serv_addr);
       serv_addr.sun_family = AF_UNIX;
+      if (strlen (socket_name)+1 >= sizeof serv_addr.sun_path )
+        {
+          log_error (_("socket name '%s' is too long\n"), socket_name);
+          dirmngr_exit (1);
+        }
       strcpy (serv_addr.sun_path, socket_name);
+#endif /* Assuan < 2.1.4 */
+
       len = SUN_LEN (&serv_addr);
 
       rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len);
@@ -1075,7 +1108,7 @@ main (int argc, char **argv)
               ))
 	{
           /* Fixme: We should test whether a dirmngr is already running. */
-	  gnupg_remove (socket_name);
+	  gnupg_remove (redir_socket_name? redir_socket_name : socket_name);
 	  rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len);
 	}
       if (rc != -1
@@ -1084,7 +1117,8 @@ main (int argc, char **argv)
       if (rc == -1)
         {
           log_error (_("error binding socket to '%s': %s\n"),
-                     serv_addr.sun_path, gpg_strerror (gpg_error_from_errno (errno)));
+                     serv_addr.sun_path,
+                     gpg_strerror (gpg_error_from_errno (errno)));
           assuan_sock_close (fd);
           dirmngr_exit (1);
         }
@@ -1098,7 +1132,7 @@ main (int argc, char **argv)
         }
 
       if (opt.verbose)
-        log_info (_("listening on socket '%s'\n"), socket_name );
+        log_info (_("listening on socket '%s'\n"), serv_addr.sun_path);
 
       es_fflush (NULL);
 
@@ -1132,7 +1166,7 @@ main (int argc, char **argv)
 
           /* Create the info string: <name>:<pid>:<protocol_version> */
           if (asprintf (&infostr, "%s=%s:%lu:1",
-                        DIRMNGR_INFO_NAME, socket_name, (ulong)pid ) < 0)
+                        DIRMNGR_INFO_NAME, serv_addr.sun_path, (ulong)pid ) < 0)
             {
               log_error (_("out of core\n"));
               kill (pid, SIGTERM);
@@ -1412,7 +1446,9 @@ cleanup (void)
   if (cleanup_socket)
     {
       cleanup_socket = 0;
-      if (socket_name && *socket_name)
+      if (redir_socket_name)
+        gnupg_remove (redir_socket_name);
+      else if (socket_name && *socket_name)
         gnupg_remove (socket_name);
     }
 }

commit cdd451d5c2bdd7e157edfee6e9b2b327a86ddeae
Author: Werner Koch <wk at gnupg.org>
Date:   Mon Dec 1 09:49:16 2014 +0100

    agent: Fix compile problem for old Libassuan.
    
    --

diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 3ad2c1d..7576cf9 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -1574,7 +1574,6 @@ create_server_socket (char *name, int primary,
       }
   }
 #else /* Assuan < 2.1.4 */
-  redirected = 0;
   memset (unaddr, 0, sizeof *unaddr);
   unaddr->sun_family = AF_UNIX;
   if (strlen (name) + 1 >= sizeof (unaddr->sun_path))

-----------------------------------------------------------------------

Summary of changes:
 agent/gpg-agent.c |    5 ++-
 dirmngr/dirmngr.c |   60 +++++++++++++++++++++++++++-------
 scd/scdaemon.c    |   92 ++++++++++++++++++++++++++++++++++++++---------------
 3 files changed, 117 insertions(+), 40 deletions(-)


hooks/post-receive
-- 
The GNU Privacy Guard
http://git.gnupg.org




More information about the Gnupg-commits mailing list