[git] GnuPG - branch, master, updated. gnupg-2.1.14-25-g66c0dab

by Justus Winter cvs at cvs.gnupg.org
Tue Jul 26 16:04:47 CEST 2016


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  66c0dab3c722c2766828515120775b106286334e (commit)
       via  f17aecbcd98103fcd2ece537be96930f354de656 (commit)
       via  b3610badf691178bbbf0831af9aa6b6658c1948a (commit)
       via  35132a8b119dbc3393ceb0d0874917905d1a6354 (commit)
       via  fe40e9c53dc0710ff73e72d05ba8040874465b55 (commit)
      from  4ba11251aff578394000bf480f47160f0879c763 (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 66c0dab3c722c2766828515120775b106286334e
Author: Justus Winter <justus at g10code.com>
Date:   Tue Jul 26 16:03:06 2016 +0200

    tests: Fix distcheck.
    
    * tests/openpgp/Makefile.am (samplekeys): Add missing key.
    
    Fixes-commit: 4ba11251
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am
index b65cc6d..f8932d6 100644
--- a/tests/openpgp/Makefile.am
+++ b/tests/openpgp/Makefile.am
@@ -151,7 +151,8 @@ sample_keys = samplekeys/README \
 	      samplekeys/ssh-dsa.key \
 	      samplekeys/ssh-ecdsa.key \
 	      samplekeys/ssh-ed25519.key \
-	      samplekeys/ssh-rsa.key
+	      samplekeys/ssh-rsa.key \
+	      samplekeys/issue2346.gpg
 
 EXTRA_DIST = defs.inc defs.scm pinentry.sh $(TESTS) $(TEST_FILES) \
 	     mkdemodirs signdemokey $(priv_keys) $(sample_keys)   \

commit f17aecbcd98103fcd2ece537be96930f354de656
Author: Justus Winter <justus at g10code.com>
Date:   Tue Jul 26 15:53:50 2016 +0200

    gpgscm: Make the verbose setting more useful.
    
    * tests/gpgscm/ffi.c (do_get_verbose): New function.
    (do_set_verbose): Likewise.
    (ffi_init): Turn *verbose* into a function, add *set-verbose!*.
    * tests/gpgscm/tests.scm (call): Adapt accordingly.
    (call-with-io): Dump output if *verbose* is high.
    (pipe-do): Adapt accordingly.
    * tests/openpgp/defs.scm: Set verbosity according to environment.
    * tests/openpgp/run-tests.scm (test): Adapt accordingly.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tests/gpgscm/ffi.c b/tests/gpgscm/ffi.c
index 5494c4d..c37bf1d 100644
--- a/tests/gpgscm/ffi.c
+++ b/tests/gpgscm/ffi.c
@@ -1052,6 +1052,30 @@ do_glob (scheme *sc, pointer args)
 }
 
 

+
+static pointer
+do_get_verbose (scheme *sc, pointer args)
+{
+  FFI_PROLOG ();
+  FFI_ARGS_DONE_OR_RETURN (sc, args);
+  FFI_RETURN_INT (sc, verbose);
+}
+
+static pointer
+do_set_verbose (scheme *sc, pointer args)
+{
+  FFI_PROLOG ();
+  int new_verbosity, old;
+  FFI_ARG_OR_RETURN (sc, int, new_verbosity, number, args);
+  FFI_ARGS_DONE_OR_RETURN (sc, args);
+
+  old = verbose;
+  verbose = new_verbosity;
+
+  FFI_RETURN_INT (sc, old);
+}
+
+

 gpg_error_t
 ffi_list2argv (scheme *sc, pointer list, char ***argv, size_t *len)
 {
@@ -1260,7 +1284,8 @@ ffi_init (scheme *sc, const char *argv0, int argc, const char **argv)
   ffi_define_function (sc, prompt);
 
   /* Configuration.  */
-  ffi_define (sc, "*verbose*", sc->vptr->mk_integer (sc, verbose));
+  ffi_define_function_name (sc, "*verbose*", get_verbose);
+  ffi_define_function_name (sc, "*set-verbose!*", set_verbose);
 
   ffi_define (sc, "*argv0*", sc->vptr->mk_string (sc, argv0));
   for (i = argc - 1; i >= 0; i--)
diff --git a/tests/gpgscm/tests.scm b/tests/gpgscm/tests.scm
index e14e0e3..f97b22e 100644
--- a/tests/gpgscm/tests.scm
+++ b/tests/gpgscm/tests.scm
@@ -92,8 +92,8 @@
 (define (call what)
   (call-with-fds what
 		 CLOSED_FD
-		 (if (< *verbose* 0) STDOUT_FILENO CLOSED_FD)
-		 (if (< *verbose* 0) STDERR_FILENO CLOSED_FD)))
+		 (if (< (*verbose*) 0) STDOUT_FILENO CLOSED_FD)
+		 (if (< (*verbose*) 0) STDERR_FILENO CLOSED_FD)))
 
 ;; Accessor functions for the results of 'spawn-process'.
 (define :stdin car)
@@ -110,6 +110,11 @@
 	   (result (wait-process (car what) (:pid h) #t)))
       (es-fclose (:stdout h))
       (es-fclose (:stderr h))
+      (if (> (*verbose*) 2)
+	  (begin
+	    (echo (stringify what) "returned:" result)
+	    (echo (stringify what) "wrote to stdout:" out)
+	    (echo (stringify what) "wrote to stderr:" err)))
       (list result out err))))
 
 ;; Accessor function for the results of 'call-with-io'.  ':stdout' and
@@ -360,7 +365,7 @@
   (lambda (M)
     (define (do-spawn M new-source)
       (let ((pid (spawn-process-fd command M::source M::sink
-				   (if (> *verbose* 0)
+				   (if (> (*verbose*) 0)
 				       STDERR_FILENO CLOSED_FD)))
 	    (M' (M::set-source new-source)))
 	(M'::add-proc command pid)))
diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm
index 8ceffc8..06bc0b8 100644
--- a/tests/openpgp/defs.scm
+++ b/tests/openpgp/defs.scm
@@ -132,3 +132,7 @@
        (list (string->number (cadr p)) (caddr p))))
    (string-split
     (call-popen `(, at GPG --with-colons , at args) input) #\newline)))
+
+(let ((verbose (string->number (getenv "verbose"))))
+  (if (number? verbose)
+      (*set-verbose!* verbose)))
diff --git a/tests/openpgp/run-tests.scm b/tests/openpgp/run-tests.scm
index a921fdb..ad94baf 100644
--- a/tests/openpgp/run-tests.scm
+++ b/tests/openpgp/run-tests.scm
@@ -72,7 +72,7 @@
 (define test
   (package
    (define (scm name . args)
-     (new name #f `(,*argv0* ,@(verbosity *verbose*) , at args
+     (new name #f `(,*argv0* ,@(verbosity (*verbose*)) , at args
 			     ,(in-srcdir name)) #f #f))
    (define (new name directory command pid retcode)
      (package

commit b3610badf691178bbbf0831af9aa6b6658c1948a
Author: Justus Winter <justus at g10code.com>
Date:   Tue Jul 26 14:49:02 2016 +0200

    common: Avoid excessive stack use.
    
    * common/exectool.c (copy_buffer_shred): Make passing NULL a nop.
    (gnupg_exec_tool_stream): Allocate copy buffers from the heap.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/common/exectool.c b/common/exectool.c
index 9c1cf65..e46071c 100644
--- a/common/exectool.c
+++ b/common/exectool.c
@@ -214,6 +214,8 @@ copy_buffer_init (struct copy_buffer *c)
 static void
 copy_buffer_shred (struct copy_buffer *c)
 {
+  if (c == NULL)
+    return;
   wipememory (c->buffer, sizeof c->buffer);
   c->writep = NULL;
   c->nread = ~0U;
@@ -316,13 +318,34 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
   int argsaveidx;
   int count;
   read_and_log_buffer_t fderrstate;
-  struct copy_buffer cpbuf_in, cpbuf_out, cpbuf_extra; /* Fixme: malloc them. */
+  struct copy_buffer *cpbuf_in = NULL, *cpbuf_out = NULL, *cpbuf_extra = NULL;
 
   memset (fds, 0, sizeof fds);
   memset (&fderrstate, 0, sizeof fderrstate);
-  copy_buffer_init (&cpbuf_in);
-  copy_buffer_init (&cpbuf_out);
-  copy_buffer_init (&cpbuf_extra);
+
+  cpbuf_in = xtrymalloc (sizeof *cpbuf_in);
+  if (cpbuf_in == NULL)
+    {
+      err = my_error_from_syserror ();
+      goto leave;
+    }
+  copy_buffer_init (cpbuf_in);
+
+  cpbuf_out = xtrymalloc (sizeof *cpbuf_out);
+  if (cpbuf_out == NULL)
+    {
+      err = my_error_from_syserror ();
+      goto leave;
+    }
+  copy_buffer_init (cpbuf_out);
+
+  cpbuf_extra = xtrymalloc (sizeof *cpbuf_extra);
+  if (cpbuf_extra == NULL)
+    {
+      err = my_error_from_syserror ();
+      goto leave;
+    }
+  copy_buffer_init (cpbuf_extra);
 
   fderrstate.pgmname = pgmname;
   fderrstate.status_cb = status_cb;
@@ -408,7 +431,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
 
       if (fds[0].got_write)
         {
-          err = copy_buffer_do_copy (&cpbuf_in, input, fds[0].stream);
+          err = copy_buffer_do_copy (cpbuf_in, input, fds[0].stream);
           if (err)
             {
               log_error ("error feeding data to '%s': %s\n",
@@ -418,7 +441,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
 
           if (es_feof (input))
             {
-              err = copy_buffer_flush (&cpbuf_in, fds[0].stream);
+              err = copy_buffer_flush (cpbuf_in, fds[0].stream);
               if (err)
                 {
                   log_error ("error feeding data to '%s': %s\n",
@@ -434,7 +457,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
       if (fds[3].got_write)
         {
           log_assert (inextra);
-          err = copy_buffer_do_copy (&cpbuf_extra, inextra, fds[3].stream);
+          err = copy_buffer_do_copy (cpbuf_extra, inextra, fds[3].stream);
           if (err)
             {
               log_error ("error feeding data to '%s': %s\n",
@@ -444,7 +467,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
 
           if (es_feof (inextra))
             {
-              err = copy_buffer_flush (&cpbuf_extra, fds[3].stream);
+              err = copy_buffer_flush (cpbuf_extra, fds[3].stream);
               if (err)
                 {
                   log_error ("error feeding data to '%s': %s\n",
@@ -459,7 +482,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
 
       if (fds[1].got_read)
         {
-          err = copy_buffer_do_copy (&cpbuf_out, fds[1].stream, output);
+          err = copy_buffer_do_copy (cpbuf_out, fds[1].stream, output);
           if (err)
             {
               log_error ("error reading data from '%s': %s\n",
@@ -469,7 +492,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
 
           if (es_feof (fds[1].stream))
             {
-              err = copy_buffer_flush (&cpbuf_out, output);
+              err = copy_buffer_flush (cpbuf_out, output);
               if (err)
                 {
                   log_error ("error reading data from '%s': %s\n",
@@ -506,10 +529,12 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
     gnupg_wait_process (pgmname, pid, 1, NULL);
   gnupg_release_process (pid);
 
-  copy_buffer_shred (&cpbuf_in);
-  copy_buffer_shred (&cpbuf_out);
-  if (inextra)
-    copy_buffer_shred (&cpbuf_extra);
+  copy_buffer_shred (cpbuf_in);
+  xfree (cpbuf_in);
+  copy_buffer_shred (cpbuf_out);
+  xfree (cpbuf_out);
+  copy_buffer_shred (cpbuf_extra);
+  xfree (cpbuf_extra);
   xfree (fderrstate.buffer);
   return err;
 }

commit 35132a8b119dbc3393ceb0d0874917905d1a6354
Author: Justus Winter <justus at g10code.com>
Date:   Tue Jul 26 14:31:11 2016 +0200

    common: Rework resource cleanup when handling errors.
    
    * common/exectool.c (gnupg_exec_tool_stream): Rework error handling.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/common/exectool.c b/common/exectool.c
index b43e7cb..9c1cf65 100644
--- a/common/exectool.c
+++ b/common/exectool.c
@@ -1,5 +1,6 @@
 /* exectool.c - Utility functions to execute a helper tool
  * Copyright (C) 2015 Werner Koch
+ * Copyright (C) 2016 g10 Code GmbH
  *
  * This file is part of GnuPG.
  *
@@ -303,10 +304,10 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
                         void *status_cb_value)
 {
   gpg_error_t err;
-  pid_t pid;
+  pid_t pid = (pid_t) -1;
   estream_t infp = NULL;
   estream_t extrafp = NULL;
-  estream_t outfp, errfp;
+  estream_t outfp = NULL, errfp = NULL;
   es_poll_t fds[4];
   int exceptclose[2];
   int extrapipe[2] = {-1, -1};
@@ -329,7 +330,10 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
   fderrstate.buffer_size = 256;
   fderrstate.buffer = xtrymalloc (fderrstate.buffer_size);
   if (!fderrstate.buffer)
-    return my_error_from_syserror ();
+    {
+      err = my_error_from_syserror ();
+      goto leave;
+    }
 
   if (inextra)
     {
@@ -338,8 +342,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
         {
           log_error ("error running outbound pipe for extra fp: %s\n",
                      gpg_strerror (err));
-          xfree (fderrstate.buffer);
-          return err;
+          goto leave;
         }
       exceptclose[0] = extrapipe[0]; /* Do not close in child. */
       exceptclose[1] = -1;
@@ -369,9 +372,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
   if (err)
     {
       log_error ("error running '%s': %s\n", pgmname, gpg_strerror (err));
-      es_fclose (extrafp);
-      xfree (fderrstate.buffer);
-      return err;
+      goto leave;
     }
 
   fds[0].stream = infp;
@@ -494,7 +495,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[],
   pid = (pid_t)(-1);
 
  leave:
-  if (err)
+  if (err && pid != (pid_t) -1)
     gnupg_kill_process (pid);
 
   es_fclose (infp);

commit fe40e9c53dc0710ff73e72d05ba8040874465b55
Author: Justus Winter <justus at g10code.com>
Date:   Tue Jul 26 14:29:12 2016 +0200

    common: Add unit test for exectool.
    
    * common/Makefile.am: Build new test.
    * common/t-exectool.c: New file.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/common/Makefile.am b/common/Makefile.am
index 6f9d96d..759800b 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -160,7 +160,7 @@ module_tests = t-stringhelp t-timestuff \
 	       t-mapstrings t-zb32 t-mbox-util t-iobuf t-strlist \
 	       t-name-value t-ccparray t-recsel
 if !HAVE_W32CE_SYSTEM
-module_tests += t-exechelp
+module_tests += t-exechelp t-exectool
 endif
 if HAVE_W32_SYSTEM
 module_tests += t-w32-reg
@@ -196,6 +196,7 @@ t_helpfile_LDADD = $(t_common_ldadd)
 t_sexputil_LDADD = $(t_common_ldadd)
 t_b64_LDADD = $(t_common_ldadd)
 t_exechelp_LDADD = $(t_common_ldadd)
+t_exectool_LDADD = $(t_common_ldadd)
 t_session_env_LDADD = $(t_common_ldadd)
 t_openpgp_oid_LDADD = $(t_common_ldadd)
 t_ssh_utils_LDADD = $(t_common_ldadd)
diff --git a/common/t-exectool.c b/common/t-exectool.c
new file mode 100644
index 0000000..bbbf8fa
--- /dev/null
+++ b/common/t-exectool.c
@@ -0,0 +1,223 @@
+/* t-exectool.c - Module test for exectool.c
+ * Copyright (C) 2016 g10 Code GmbH
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
+
+#include "util.h"
+#include "exectool.h"
+
+static int verbose;
+
+#define fail(msg, err)                                           \
+  do { fprintf (stderr, "%s:%d: %s failed: %s\n",                \
+                __FILE__,__LINE__, (msg), gpg_strerror (err));   \
+    exit (1);                                                    \
+  } while(0)
+
+static void
+test_executing_true (void)
+{
+  gpg_error_t err;
+  const char *argv[] = { "/bin/true", NULL };
+  char *result;
+  size_t len;
+
+  if (access (argv[0], X_OK))
+    {
+      fprintf (stderr, "skipping test: %s not executable: %s",
+               argv[0], strerror (errno));
+      return;
+    }
+
+  if (verbose)
+    fprintf (stderr, "Executing %s...\n", argv[0]);
+
+  err = gnupg_exec_tool (argv[0], &argv[1], "", &result, &len);
+  if (err)
+    fail ("gnupg_exec_tool", err);
+
+  assert (result);
+  assert (len == 0);
+  free (result);
+}
+
+static void
+test_executing_false (void)
+{
+  gpg_error_t err;
+  const char *argv[] = { "/bin/false", NULL };
+  char *result;
+  size_t len;
+
+  if (access (argv[0], X_OK))
+    {
+      fprintf (stderr, "skipping test: %s not executable: %s",
+               argv[0], strerror (errno));
+      return;
+    }
+
+  if (verbose)
+    fprintf (stderr, "Executing %s...\n", argv[0]);
+
+  err = gnupg_exec_tool (argv[0], &argv[1], "", &result, &len);
+  assert (err == GPG_ERR_GENERAL);
+}
+
+static void
+test_executing_cat (const char *vector)
+{
+  gpg_error_t err;
+  const char *argv[] = { "/bin/cat", NULL };
+  char *result;
+  size_t len;
+
+  if (access (argv[0], X_OK))
+    {
+      fprintf (stderr, "skipping test: %s not executable: %s",
+               argv[0], strerror (errno));
+      return;
+    }
+
+  if (verbose)
+    fprintf (stderr, "Executing %s...\n", argv[0]);
+
+  err = gnupg_exec_tool (argv[0], &argv[1], vector, &result, &len);
+  if (err)
+    fail ("gnupg_exec_tool", err);
+
+  assert (result);
+
+  /* gnupg_exec_tool returns the correct length... */
+  assert (len == strlen (vector));
+  /* ... but 0-terminates data for ease of use.  */
+  assert (result[len] == 0);
+
+  assert (strcmp (result, vector) == 0);
+  free (result);
+}
+
+
+static void
+test_catting_cat (void)
+{
+  gpg_error_t err;
+  const char *argv[] = { "/bin/cat", "/bin/cat", NULL };
+  char *result;
+  size_t len;
+  estream_t in;
+  char *reference, *p;
+  size_t reference_len;
+
+  if (access (argv[0], X_OK))
+    {
+      fprintf (stderr, "skipping test: %s not executable: %s",
+               argv[0], strerror (errno));
+      return;
+    }
+
+  in = es_fopen (argv[1], "r");
+  if (in == NULL)
+    {
+      fprintf (stderr, "skipping test: could not open %s: %s",
+               argv[1], strerror (errno));
+      return;
+    }
+
+  err = es_fseek (in, 0L, SEEK_END);
+  if (err)
+    {
+      fprintf (stderr, "skipping test: could not seek in %s: %s",
+               argv[1], gpg_strerror (err));
+      return;
+    }
+
+  reference_len = es_ftell (in);
+  err = es_fseek (in, 0L, SEEK_SET);
+  assert (!err || !"rewinding failed");
+
+  reference = malloc (reference_len);
+  assert (reference || !"allocating reference buffer failed");
+
+  for (p = reference; p - reference < reference_len; )
+    {
+      size_t bytes_read, left;
+      left = reference_len - (p - reference);
+      if (left > 4096)
+        left = 4096;
+      err = es_read (in, p, left, &bytes_read);
+      if (err)
+        {
+          fprintf (stderr, "error reading %s: %s",
+                   argv[1], gpg_strerror (err));
+          exit (1);
+        }
+
+      p += bytes_read;
+    }
+  es_fclose (in);
+
+  if (verbose)
+    fprintf (stderr, "Executing %s %s...\n", argv[0], argv[1]);
+
+  err = gnupg_exec_tool (argv[0], &argv[1], "", &result, &len);
+  if (err)
+    fail ("gnupg_exec_tool", err);
+
+  assert (result);
+
+  /* gnupg_exec_tool returns the correct length... */
+  assert (len == reference_len);
+  assert (memcmp (result, reference, reference_len) == 0);
+  free (reference);
+  free (result);
+}
+
+
+int
+main (int argc, char **argv)
+{
+  int i;
+  char binjunk[256];
+
+  if (argc)
+    { argc--; argv++; }
+  if (argc && !strcmp (argv[0], "--verbose"))
+    {
+      verbose = 1;
+      argc--; argv++;
+    }
+
+  test_executing_true ();
+  test_executing_false ();
+  test_executing_cat ("Talking to myself here...");
+
+  for (i = 0; i < 255 /* one less */; i++)
+    binjunk[i] = i + 1;	/* avoid 0 */
+  binjunk[255] = 0;
+
+  test_executing_cat (binjunk);
+  test_catting_cat ();
+
+  return 0;
+}

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

Summary of changes:
 common/Makefile.am          |   3 +-
 common/exectool.c           |  72 +++++++++-----
 common/t-exectool.c         | 223 ++++++++++++++++++++++++++++++++++++++++++++
 tests/gpgscm/ffi.c          |  27 +++++-
 tests/gpgscm/tests.scm      |  11 ++-
 tests/openpgp/Makefile.am   |   3 +-
 tests/openpgp/defs.scm      |   4 +
 tests/openpgp/run-tests.scm |   2 +-
 8 files changed, 315 insertions(+), 30 deletions(-)
 create mode 100644 common/t-exectool.c


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




More information about the Gnupg-commits mailing list