core: Also check for a failed selftest in gpgm_data_new.
authorWerner Koch <wk@gnupg.org>
Mon, 4 Dec 2017 11:08:31 +0000 (12:08 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 4 Dec 2017 11:08:31 +0000 (12:08 +0100)
* src/data.c (_gpgme_data_new): Check for failed selftest.
* tests/run-support.h (make_filename): Print a message on mallooc
failure.
(init_gpgme_basic): New.
* tests/run-identify.c (main): Call init_gpgme_basic becuase we do not
need to setup a protocol.
* tests/t-data.c: Define PGM and include run-support.h.
(make_filename): Remove.
(main): Call init_gpgme_basic.
--

Note: This patch may break applications which used gpgme_data but no
gpgme_new without having called the required gpgme_check_version.

GPGME can be used without a protocol for example to work with the data
object abstraction.  Thus a call to gpgme_data_new also needs to check
the result of the core selftests - including on whether
gpgme_check_version has been called.

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/gpgme.texi
src/data.c
tests/run-identify.c
tests/run-support.h
tests/t-data.c

index 8dcc86e..3b461ba 100644 (file)
@@ -683,9 +683,10 @@ uses, this function provides a run-time check if the necessary
 features are provided by the installed version of the library.
 
 If a selftest fails, the function may still succeed.  Selftest errors
-are returned later when invoking @code{gpgme_new}, so that a detailed
-error code can be returned (historically, @code{gpgme_check_version}
-does not return a detailed error code).
+are returned later when invoking @code{gpgme_new} or
+@code{gpgme-data_new}, so that a detailed error code can be returned
+(historically, @code{gpgme_check_version} does not return a detailed
+error code).
 @end deftypefun
 
 
index e4e9ee3..7ae5b32 100644 (file)
@@ -46,6 +46,10 @@ _gpgme_data_new (gpgme_data_t *r_dh, struct _gpgme_data_cbs *cbs)
     return gpg_error (GPG_ERR_INV_VALUE);
 
   *r_dh = NULL;
+
+  if (_gpgme_selftest)
+    return _gpgme_selftest;
+
   dh = calloc (1, sizeof (*dh));
   if (!dh)
     return gpg_error_from_syserror ();
index 01e9671..9361fa2 100644 (file)
@@ -102,7 +102,7 @@ main (int argc, char **argv)
 
     }
 
-  init_gpgme (GPGME_PROTOCOL_OpenPGP);
+  init_gpgme_basic ();
 
   for (; argc; argc--, argv++)
     {
index 841b223..6a2170b 100644 (file)
@@ -107,7 +107,11 @@ make_filename (const char *fname)
     srcdir = ".";
   buf = malloc (strlen(srcdir) + strlen(fname) + 2);
   if (!buf)
-    exit (8);
+    {
+      fprintf (stderr, "%s:%d: could not allocate string: %s\n",
+              __FILE__, __LINE__, strerror (errno));
+      exit (8);
+    }
   strcpy (buf, srcdir);
   strcat (buf, "/");
   strcat (buf, fname);
@@ -116,17 +120,23 @@ make_filename (const char *fname)
 
 
 void
-init_gpgme (gpgme_protocol_t proto)
+init_gpgme_basic (void)
 {
-  gpgme_error_t err;
-
   gpgme_check_version (NULL);
   setlocale (LC_ALL, "");
   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
 #ifndef HAVE_W32_SYSTEM
   gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
 #endif
+}
+
+
+void
+init_gpgme (gpgme_protocol_t proto)
+{
+  gpg_error_t err;
 
+  init_gpgme_basic ();
   err = gpgme_engine_check_version (proto);
   fail_if_err (err);
 }
index fe2d59e..c214de7 100644 (file)
 #include <string.h>
 #include <errno.h>
 
-#include <gpgme.h>
+#define PGM "t-data"
+#include "run-support.h"
 
+#undef fail_if_err
 #define fail_if_err(a) do { if(a) {                                          \
                                fprintf (stderr, "%s:%d: (%i) gpgme_error_t " \
                                 "%s\n", __FILE__, __LINE__, round,           \
                                 exit (1); }                                  \
                              } while(0)
 
-static char *
-make_filename (const char *fname)
-{
-  const char *srcdir = getenv ("srcdir");
-  char *buf;
-
-  if (!srcdir)
-    srcdir = ".";
-  buf = malloc (strlen(srcdir) + strlen(fname) + 2 );
-  if (!buf)
-    {
-      fprintf (stderr, "%s:%d: could not allocate string: %s\n",
-              __FILE__, __LINE__, strerror (errno));
-      exit (1);
-    }
-  strcpy (buf, srcdir);
-  strcat (buf, "/");
-  strcat (buf, fname);
-  return buf;
-}
-
 typedef enum
   {
     TEST_INITIALIZER,
@@ -203,6 +184,8 @@ main (void)
   gpgme_error_t err = 0;
   gpgme_data_t data;
 
+  init_gpgme_basic ();
+
   while (++round)
     {
       switch (round)