[git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-392-gfdd938a

by Werner Koch cvs at cvs.gnupg.org
Tue Apr 22 16:58:41 CEST 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  fdd938a5bbecb5b70f564ae3afb4e17905404bb2 (commit)
       via  71a54313adf7b57b7b27bb9ad07b142a34306260 (commit)
       via  1a87edab6657a257876ab2f8790f2937feba7066 (commit)
      from  ffa39be5ebfc1059a737905ee317c9b6f3d2a77e (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 fdd938a5bbecb5b70f564ae3afb4e17905404bb2
Author: Werner Koch <wk at gnupg.org>
Date:   Tue Apr 15 16:40:48 2014 +0200

    gpg: Pass --homedir to gpg-agent.
    
    * agent/gpg-agent.c (main): Make sure homedir is absolute.
    * common/asshelp.c (lock_spawning): Create lock file with an absolute
    name.
    (start_new_gpg_agent): Use an absolute name for the socket and pass
    option --homedir to the agent.
    (start_new_dirmngr): Use an absolute name for the --homedir.
    --
    
    This patch makes gpg's --homedir option behave again like in older
    versions.  This is done by starting a new agent for each different
    home directory.  Note that this assumes --use-standard-socket is used
    which is the default for 2.1.

diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 5554d3f..8078cba 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -885,6 +885,10 @@ main (int argc, char **argv )
   if (nogreeting )
     greeting = 0;
 
+  /* Turn the homedir into an absolute one. */
+  opt.homedir = make_absfilename (opt.homedir, NULL);
+
+
   if (greeting)
     {
       es_fprintf (es_stderr, "%s %s; %s\n",
diff --git a/common/asshelp.c b/common/asshelp.c
index 4763de1..5e3f663 100644
--- a/common/asshelp.c
+++ b/common/asshelp.c
@@ -301,7 +301,7 @@ lock_spawning (lock_spawn_t *lock, const char *homedir, const char *name,
 
   *lock = NULL;
 
-  fname = make_filename
+  fname = make_absfilename_try
     (homedir,
      !strcmp (name, "agent")?   "gnupg_spawn_agent_sentinel":
      !strcmp (name, "dirmngr")? "gnupg_spawn_dirmngr_sentinel":
@@ -382,17 +382,19 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
   if (!infostr || !*infostr)
     {
       char *sockname;
-      const char *argv[3];
+      const char *argv[5];
       pid_t pid;
       int excode;
 
       /* First check whether we can connect at the standard
          socket.  */
-      sockname = make_filename (homedir, GPG_AGENT_SOCK_NAME, NULL);
+      sockname = make_absfilename (homedir, GPG_AGENT_SOCK_NAME, NULL);
       err = assuan_socket_connect (ctx, sockname, 0, 0);
 
       if (err)
         {
+          char *abs_homedir;
+
           /* With no success start a new server.  */
           if (!agent_program || !*agent_program)
             agent_program = gnupg_module_name (GNUPG_MODULE_NAME_AGENT);
@@ -405,6 +407,20 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
             status_cb (status_cb_arg, STATUS_PROGRESS,
                        "starting_agent ? 0 0", NULL);
 
+          /* We better pass an absolute home directory to the agent
+             just in casee gpg-agent does not convert the passed name
+             to an absolute one (which it should do).  */
+          abs_homedir = make_absfilename_try (homedir, NULL);
+          if (!abs_homedir)
+            {
+              gpg_error_t tmperr = gpg_err_make (errsource,
+                                                 gpg_err_code_from_syserror ());
+              log_error ("error building filename: %s\n",gpg_strerror (tmperr));
+              xfree (sockname);
+	      assuan_release (ctx);
+              return tmperr;
+            }
+
           if (fflush (NULL))
             {
               gpg_error_t tmperr = gpg_err_make (errsource,
@@ -413,11 +429,14 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
                          strerror (errno));
               xfree (sockname);
 	      assuan_release (ctx);
+              xfree (abs_homedir);
               return tmperr;
             }
 
-          argv[0] = "--use-standard-socket-p";
-          argv[1] = NULL;
+          argv[0] = "--homedir";
+          argv[1] = abs_homedir;
+          argv[2] = "--use-standard-socket-p";
+          argv[3] = NULL;
           err = gnupg_spawn_process_fd (agent_program, argv, -1, -1, -1, &pid);
           if (err)
             log_debug ("starting '%s' for testing failed: %s\n",
@@ -438,9 +457,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
                  here.  */
               lock_spawn_t lock;
 
-              argv[0] = "--daemon";
-              argv[1] = "--use-standard-socket";
-              argv[2] = NULL;
+              argv[0] = "--homedir";
+              argv[1] = abs_homedir;
+              argv[2] = "--use-standard-socket";
+              argv[3] = "--daemon";
+              argv[4] = NULL;
 
               if (!(err = lock_spawning (&lock, homedir, "agent", verbose))
                   && assuan_socket_connect (ctx, sockname, 0, 0))
@@ -492,9 +513,11 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
               else
                 pgmname++;
 
-              argv[0] = pgmname;
-              argv[1] = "--server";
-              argv[2] = NULL;
+              argv[0] = pgmname;   /* (Assuan expects a standard argv.)  */
+              argv[1] = "--homedir";
+              argv[2] = abs_homedir;
+              argv[3] = "--server";
+              argv[4] = NULL;
 
               i=0;
               if (log_get_fd () != -1)
@@ -506,6 +529,7 @@ start_new_gpg_agent (assuan_context_t *r_ctx,
               err = assuan_pipe_connect (ctx, agent_program, argv,
                                          no_close_list, NULL, NULL, 0);
             }
+          xfree (abs_homedir);
         }
       xfree (sockname);
     }
@@ -646,7 +670,15 @@ start_new_dirmngr (assuan_context_t *r_ctx,
         status_cb (status_cb_arg, STATUS_PROGRESS,
                    "starting_dirmngr ? 0 0", NULL);
 
-      abs_homedir = make_filename (homedir, NULL);
+      abs_homedir = make_absfilename (homedir, NULL);
+      if (!abs_homedir)
+        {
+          gpg_error_t tmperr = gpg_err_make (errsource,
+                                             gpg_err_code_from_syserror ());
+          log_error ("error building filename: %s\n",gpg_strerror (tmperr));
+          assuan_release (ctx);
+          return tmperr;
+        }
 
       if (fflush (NULL))
         {
diff --git a/common/homedir.c b/common/homedir.c
index e2a117b..c50809f 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -600,7 +600,7 @@ dirmngr_sys_socket_name (void)
 }
 
 
-/* Return the user socket name used by DirMngr.  If a a user specific
+/* Return the user socket name used by DirMngr.  If a user specific
    dirmngr installation is not supported, NULL is returned.  */
 const char *
 dirmngr_user_socket_name (void)
@@ -611,7 +611,7 @@ dirmngr_user_socket_name (void)
   static char *name;
 
   if (!name)
-    name = make_filename (default_homedir (), DIRMNGR_SOCK_NAME, NULL);
+    name = make_absfilename (default_homedir (), DIRMNGR_SOCK_NAME, NULL);
   return name;
 #endif /*!HAVE_W32_SYSTEM*/
 }

commit 71a54313adf7b57b7b27bb9ad07b142a34306260
Author: Werner Koch <wk at gnupg.org>
Date:   Tue Apr 15 16:40:48 2014 +0200

    common: Add functions make_absfilename and make_absfilename_try.
    
    * common/stringhelp.c (do_make_filename): Add modes 2 and 3.
    (make_absfilename): New.
    (make_absfilename_try): New.

diff --git a/common/stringhelp.c b/common/stringhelp.c
index 7cbf82c..4d7c3a6 100644
--- a/common/stringhelp.c
+++ b/common/stringhelp.c
@@ -1,6 +1,7 @@
 /* stringhelp.c -  standard string helper functions
  * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007,
  *               2008, 2009, 2010  Free Software Foundation, Inc.
+ * Copyright (C) 2014 Werner Koch
  *
  * This file is part of JNLIB, which is a subsystem of GnuPG.
  *
@@ -49,9 +50,9 @@
 
 #include "libjnlib-config.h"
 #include "utf8conv.h"
+#include "sysutils.h"
 #include "stringhelp.h"
 
-
 #define tohex_lower(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'a'))
 
 /* Sometimes we want to avoid mixing slashes and backslashes on W32
@@ -395,6 +396,12 @@ get_pwdir (int xmode, const char *name)
   return result;
 }
 
+
+/* xmode 0 := Return NULL on error
+         1 := Terminate on error
+         2 := Make sure that name is absolute; return NULL on error
+         3 := Make sure that name is absolute; terminate on error
+ */
 static char *
 do_make_filename (int xmode, const char *first_part, va_list arg_ptr)
 {
@@ -404,6 +411,10 @@ do_make_filename (int xmode, const char *first_part, va_list arg_ptr)
   int skip = 1;
   char *home_buffer = NULL;
   char *name, *home, *p;
+  int want_abs;
+
+  want_abs = !!(xmode & 2);
+  xmode &= 1;
 
   n = strlen (first_part) + 1;
   argc = 0;
@@ -478,10 +489,65 @@ do_make_filename (int xmode, const char *first_part, va_list arg_ptr)
     p = stpcpy (name, first_part);
 
   jnlib_free (home_buffer);
-
   for (argc=0; argv[argc]; argc++)
     p = stpcpy (stpcpy (p, "/"), argv[argc]);
 
+  if (want_abs)
+    {
+#ifdef HAVE_DRIVE_LETTERS
+      p = strchr (name, ':');
+      if (!p)
+        p = name;
+#else
+      p = name;
+#endif
+      if (*p != '/'
+#ifdef HAVE_DRIVE_LETTERS
+          && *p != '\\'
+#endif
+          )
+        {
+          home = gnupg_getcwd ();
+          if (!home)
+            {
+              if (xmode)
+                {
+                  fprintf (stderr, "\nfatal: getcwd failed: %s\n",
+                           strerror (errno));
+                  exit(2);
+                }
+              jnlib_free (name);
+              return NULL;
+            }
+          n = strlen (home) + 1 + strlen (name) + 1;
+          if (xmode)
+            home_buffer = jnlib_xmalloc (n);
+          else
+            {
+              home_buffer = jnlib_malloc (n);
+              if (!home_buffer)
+                {
+                  jnlib_free (name);
+                  return NULL;
+                }
+            }
+          if (p == name)
+            p = home_buffer;
+          else /* Windows case.  */
+            {
+              memcpy (home_buffer, p, p - name + 1);
+              p = home_buffer + (p - name + 1);
+            }
+          strcpy (stpcpy (stpcpy (p, home), "/"), name);
+          jnlib_free (name);
+          name = home_buffer;
+          /* Let's do a simple compression to catch the most common
+             case of using "." for gpg's --homedir option.  */
+          n = strlen (name);
+          if (n > 2 && name[n-2] == '/' && name[n-1] == '.')
+            name[n-2] = 0;
+        }
+    }
   return change_slashes (name);
 }
 
@@ -515,6 +581,36 @@ make_filename_try (const char *first_part, ... )
   return result;
 }
 
+/* Construct an absolute filename from the NULL terminated list of
+   parts.  Tilde expansion is done for the first argument.  This
+   function terminates the process on memory shortage. */
+char *
+make_absfilename (const char *first_part, ... )
+{
+  va_list arg_ptr;
+  char *result;
+
+  va_start (arg_ptr, first_part);
+  result = do_make_filename (3, first_part, arg_ptr);
+  va_end (arg_ptr);
+  return result;
+}
+
+/* Construct an absolute filename from the NULL terminated list of
+   parts.  Tilde expansion is done for the first argument.  This
+   function may return NULL on error. */
+char *
+make_absfilename_try (const char *first_part, ... )
+{
+  va_list arg_ptr;
+  char *result;
+
+  va_start (arg_ptr, first_part);
+  result = do_make_filename (2, first_part, arg_ptr);
+  va_end (arg_ptr);
+  return result;
+}
+
 
 

 /* Compare whether the filenames are identical.  This is a
diff --git a/common/stringhelp.h b/common/stringhelp.h
index 21bb20d..1ad380e 100644
--- a/common/stringhelp.h
+++ b/common/stringhelp.h
@@ -53,6 +53,9 @@ char *make_basename(const char *filepath, const char *inputpath);
 char *make_dirname(const char *filepath);
 char *make_filename( const char *first_part, ... ) GNUPG_GCC_A_SENTINEL(0);
 char *make_filename_try (const char *first_part, ... ) GNUPG_GCC_A_SENTINEL(0);
+char *make_absfilename (const char *first_part, ...) GNUPG_GCC_A_SENTINEL(0);
+char *make_absfilename_try (const char *first_part,
+                            ...) GNUPG_GCC_A_SENTINEL(0);
 int compare_filenames( const char *a, const char *b );
 
 int hextobyte (const char *s);
diff --git a/common/t-stringhelp.c b/common/t-stringhelp.c
index 990a800..dcd5a45 100644
--- a/common/t-stringhelp.c
+++ b/common/t-stringhelp.c
@@ -71,6 +71,34 @@ gethome (void)
 }
 
 
+static char *
+mygetcwd (void)
+{
+  char *buffer;
+  size_t size = 100;
+
+  for (;;)
+    {
+      buffer = xmalloc (size+1);
+#ifdef HAVE_W32CE_SYSTEM
+      strcpy (buffer, "/");  /* Always "/".  */
+      return buffer;
+#else
+      if (getcwd (buffer, size) == buffer)
+        return buffer;
+      xfree (buffer);
+      if (errno != ERANGE)
+        {
+          fprintf (stderr,"error getting current cwd: %s\n",
+                   strerror (errno));
+          exit (2);
+        }
+      size *= 2;
+#endif
+    }
+}
+
+
 static void
 test_percent_escape (void)
 {
@@ -407,6 +435,50 @@ test_make_filename_try (void)
 }
 
 
+static void
+test_make_absfilename_try (void)
+{
+  char *out;
+  char *cwd = mygetcwd ();
+  size_t cwdlen = strlen (cwd);
+
+  out = make_absfilename_try ("foo", "bar", NULL);
+  if (!out)
+    fail (0);
+  if (strlen (out) < cwdlen + 7)
+    fail (0);
+  if (strncmp (out, cwd, cwdlen))
+    fail (0);
+  if (strcmp (out+cwdlen, "/foo/bar"))
+    fail (0);
+  xfree (out);
+
+  out = make_absfilename_try ("./foo", NULL);
+  if (!out)
+    fail (1);
+  if (strlen (out) < cwdlen + 5)
+    fail (1);
+  if (strncmp (out, cwd, cwdlen))
+    fail (1);
+  if (strcmp (out+cwdlen, "/./foo"))
+    fail (1);
+  xfree (out);
+
+  out = make_absfilename_try (".", NULL);
+  if (!out)
+    fail (2);
+  if (strlen (out) < cwdlen)
+    fail (2);
+  if (strncmp (out, cwd, cwdlen))
+    fail (2);
+  if (strcmp (out+cwdlen, ""))
+    fail (2);
+  xfree (out);
+
+  xfree (cwd);
+}
+
+
 int
 main (int argc, char **argv)
 {
@@ -418,6 +490,7 @@ main (int argc, char **argv)
   test_strconcat ();
   test_xstrconcat ();
   test_make_filename_try ();
+  test_make_absfilename_try ();
 
   xfree (home_buffer);
   return 0;

commit 1a87edab6657a257876ab2f8790f2937feba7066
Author: Werner Koch <wk at gnupg.org>
Date:   Tue Apr 15 16:40:48 2014 +0200

    common: Add function gnupg_getcwd.
    
    * tools/gpg-connect-agent.c (gnu_getcwd): Move to ...
    * common/sysutils.c (gnupg_getcwd): .. here.
    * tools/gpg-connect-agent.c (get_var_ext): Use gnupg_getcwd.

diff --git a/common/sysutils.c b/common/sysutils.c
index 0d92741..95e0f8c 100644
--- a/common/sysutils.c
+++ b/common/sysutils.c
@@ -657,6 +657,36 @@ gnupg_unsetenv (const char *name)
 #endif
 }
 
+
+/* Return the current working directory as a malloced string.  Return
+   NULL and sets ERRNo on error.  */
+char *
+gnupg_getcwd (void)
+{
+  char *buffer;
+  size_t size = 100;
+
+  for (;;)
+    {
+      buffer = xtrymalloc (size+1);
+      if (!buffer)
+        return NULL;
+#ifdef HAVE_W32CE_SYSTEM
+      strcpy (buffer, "/");  /* Always "/".  */
+      return buffer;
+#else
+      if (getcwd (buffer, size) == buffer)
+        return buffer;
+      xfree (buffer);
+      if (errno != ERANGE)
+        return NULL;
+      size *= 2;
+#endif
+    }
+}
+
+
+

 #ifdef HAVE_W32CE_SYSTEM
 /* There is a isatty function declaration in cegcc but it does not
    make sense, thus we redefine it.  */
diff --git a/common/sysutils.h b/common/sysutils.h
index da2c250..d139665 100644
--- a/common/sysutils.h
+++ b/common/sysutils.h
@@ -63,6 +63,7 @@ int  gnupg_remove (const char *fname);
 int  gnupg_mkdir (const char *name, const char *modestr);
 int  gnupg_setenv (const char *name, const char *value, int overwrite);
 int  gnupg_unsetenv (const char *name);
+char *gnupg_getcwd (void);
 
 #ifdef HAVE_W32_SYSTEM
 void *w32_get_user_sid (void);
diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c
index 81e981b..07c3391 100644
--- a/tools/gpg-connect-agent.c
+++ b/tools/gpg-connect-agent.c
@@ -212,30 +212,6 @@ my_strusage( int level )
 }
 
 
-static char *
-gnu_getcwd (void)
-{
-  char *buffer;
-  size_t size = 100;
-
-  for (;;)
-    {
-      buffer = xmalloc (size+1);
-#ifdef HAVE_W32CE_SYSTEM
-      strcpy (buffer, "/");
-      return buffer;
-#else
-      if (getcwd (buffer, size) == buffer)
-        return buffer;
-      xfree (buffer);
-      if (errno != ERANGE)
-        return NULL;
-      size *= 2;
-#endif
-    }
-}
-
-
 /* Unescape STRING and returned the malloced result.  The surrounding
    quotes must already be removed from STRING.  */
 static char *
@@ -568,7 +544,7 @@ get_var_ext (const char *name)
         s++;
       if (!strcmp (s, "cwd"))
         {
-          result = gnu_getcwd ();
+          result = gnupg_getcwd ();
           if (!result)
             log_error ("getcwd failed: %s\n", strerror (errno));
         }

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

Summary of changes:
 agent/gpg-agent.c         |    4 ++
 common/asshelp.c          |   56 +++++++++++++++++++------
 common/homedir.c          |    4 +-
 common/stringhelp.c       |  100 ++++++++++++++++++++++++++++++++++++++++++++-
 common/stringhelp.h       |    3 ++
 common/sysutils.c         |   30 ++++++++++++++
 common/sysutils.h         |    1 +
 common/t-stringhelp.c     |   73 +++++++++++++++++++++++++++++++++
 tools/gpg-connect-agent.c |   26 +-----------
 9 files changed, 256 insertions(+), 41 deletions(-)


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




More information about the Gnupg-commits mailing list