[git] GPG-ERROR - branch, master, updated. libgpg-error-1.27-224-ga950326

by Werner Koch cvs at cvs.gnupg.org
Fri Nov 17 17:38:49 CET 2017


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 "Error codes used by GnuPG et al.".

The branch, master has been updated
       via  a950326d20990fa33cee637d5b54d708fff585b2 (commit)
       via  b5c4a2721d7b4bd54705c53e6f294ab2ef66a6f7 (commit)
       via  0d8d46c76a32176be440b062d2501bbb044fb99d (commit)
       via  80c18e1b212cc91946864db7a53da50e9f91b861 (commit)
      from  1b653e7f37e2eb2a8f590a43651eb8aecbe8756e (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 a950326d20990fa33cee637d5b54d708fff585b2
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Nov 17 17:34:04 2017 +0100

    w32: Avoid unused code warning.
    
    * src/w32-estream.c (_gpgrt_w32_poll) [!ENABLE_TRACING]: Do not use
    waitinfo.
    --
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/src/w32-estream.c b/src/w32-estream.c
index d9a4d36..2122c59 100644
--- a/src/w32-estream.c
+++ b/src/w32-estream.c
@@ -776,7 +776,9 @@ _gpgrt_w32_poll (gpgrt_poll_t *fds, size_t nfds, int timeout)
 {
   HANDLE waitbuf[MAXIMUM_WAIT_OBJECTS];
   int waitidx[MAXIMUM_WAIT_OBJECTS];
+#ifdef ENABLE_TRACING
   char waitinfo[MAXIMUM_WAIT_OBJECTS];
+#endif
   unsigned int code;
   int nwait;
   int i;
@@ -833,7 +835,9 @@ _gpgrt_w32_poll (gpgrt_poll_t *fds, size_t nfds, int timeout)
                   return -1;
                 }
               waitidx[nwait] = i;
+#ifdef ENABLE_TRACING
               waitinfo[nwait] = 'r';
+#endif /*ENABLE_TRACING*/
               waitbuf[nwait++] = ctx->have_data_ev;
 	      any = 1;
             }
@@ -862,16 +866,20 @@ _gpgrt_w32_poll (gpgrt_poll_t *fds, size_t nfds, int timeout)
                   return -1;
                 }
               waitidx[nwait] = i;
+#ifdef ENABLE_TRACING
               waitinfo[nwait] = 'w';
+#endif /*ENABLE_TRACING*/
               waitbuf[nwait++] = ctx->is_empty;
 	      any = 1;
             }
         }
     }
+#ifdef ENABLE_TRACING
   trace_start (("poll on [ "));
   for (i = 0; i < nwait; i++)
     trace_append (("%d/%c ", waitidx[i], waitinfo[i]));
   trace_finish (("]"));
+#endif /*ENABLE_TRACING*/
   if (!any)
     return 0;
 

commit b5c4a2721d7b4bd54705c53e6f294ab2ef66a6f7
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Nov 17 17:25:58 2017 +0100

    w32: Add new API fucntion gpgrt_w32_reg_query_string.
    
    * src/w32-reg.c: New.
    * src/w32-add.h: Add gpgrt_w32_reg_query_string.
    * src/visibility.c (gpgrt_w32_reg_query_string): New wrapper.
    * src/gpg-error.def.in: Add gpgrt_w32_reg_query_string.
    * configure.ac (ac_check_funcs): Add stpcpy.
    * src/Makefile.am (arch_sources): Add w32-reg.c
    (socklibs): New.
    (libgpg_error_la_LIBADD): Add socklibs.
    * src/gpgrt-int.h (xfree, xtrymalloc, xtrycalloc)
    (xtryrealloc): New internal macros.
    (_gpgrt_stpcpy, stpcpy): New replacement fucntion and macro.
    * src/logging.c (_gpgrt_logv_internal): Use new registry query
    function and add standard registry key.
    --
    
    This also fixes the build failure on Widnwos for logging.c.
    
    The code for gpgrt_w32_reg_query_string has been taken from the
    function read_w32_registry_string in w32-utils.c in the GPGME package.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/configure.ac b/configure.ac
index 53472b3..9f3ea82 100644
--- a/configure.ac
+++ b/configure.ac
@@ -176,7 +176,7 @@ AC_MSG_WARN([[Without strerror_r, gpg_strerror_r might not be thread-safe]]))
      ;;
 esac
 
-AC_CHECK_FUNCS([flockfile vasprintf mmap rand strlwr])
+AC_CHECK_FUNCS([flockfile vasprintf mmap rand strlwr stpcpy setenv])
 
 
 #
diff --git a/src/Makefile.am b/src/Makefile.am
index 3210a65..a95b732 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -113,7 +113,7 @@ CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
 #
 if HAVE_W32_SYSTEM
 arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c \
-	       w32-iconv.c w32-estream.c
+	       w32-iconv.c w32-estream.c w32-reg.c
 RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
             -DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS) $(CPPFLAGS)
 LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
@@ -143,6 +143,7 @@ uninstall-def-file:
 
 libgpg_error_la_DEPENDENCIES = $(gpg_error_res) gpg-error.def
 intllibs =
+socklibs = -lws2_32
 
 #
 # }}} End Windows part
@@ -161,6 +162,7 @@ install-def-file:
 uninstall-def-file:
 
 intllibs = @LTLIBINTL@
+socklibs =
 
 endif
 #
@@ -197,7 +199,7 @@ nodist_libgpg_error_la_SOURCES = gpg-error.h
 # without the extra_cppflags because they may include am -idirafter
 # which is not supported by the RC compiler.
 libgpg_error_la_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
-libgpg_error_la_LIBADD = $(gpg_error_res) $(intllibs) $(LIBTHREAD)
+libgpg_error_la_LIBADD = $(gpg_error_res) $(intllibs) $(socklibs) $(LIBTHREAD)
 
 gpg_error_SOURCES = strsource-sym.c strerror-sym.c gpg-error.c
 gpg_error_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" \
diff --git a/src/gpg-error.def.in b/src/gpg-error.def.in
index 7c39502..5c7835f 100644
--- a/src/gpg-error.def.in
+++ b/src/gpg-error.def.in
@@ -189,4 +189,8 @@ EXPORTS
  gpgrt_strdup                 @144
  gpgrt_strconcat              @145
 
+#ifdef HAVE_W32_SYSTEM
+ gpgrt_w32_reg_query_string   @148
+#endif
+
 ;; end of file with public symbols for Windows.
diff --git a/src/gpgrt-int.h b/src/gpgrt-int.h
index c226e2b..c0e83b1 100644
--- a/src/gpgrt-int.h
+++ b/src/gpgrt-int.h
@@ -118,6 +118,13 @@ void _gpgrt_free (void *a);
 /* The next is only to be used by visibility.c.  */
 char *_gpgrt_strconcat_core (const char *s1, va_list arg_ptr);
 
+#define xfree(a)         _gpgrt_free ((a))
+#define xtrymalloc(a)    _gpgrt_malloc ((a))
+#define xtrycalloc(a,b)  _gpgrt_calloc ((a),(b))
+#define xtryrealloc(a,b) _gpgrt_realloc ((a),(b))
+
+
+
 const char *_gpg_error_check_version (const char *req_version);
 
 gpg_err_code_t _gpgrt_lock_init (gpgrt_lock_t *lockhd);
@@ -553,4 +560,34 @@ int _gpgrt_logv_internal (int level, int ignore_arg_ptr,
 int _gpgrt_fd_valid_p (int fd);
 
 
+

+/*
+ * Platform specific functions (Windows)
+ */
+#ifdef HAVE_W32_SYSTEM
+
+char *_gpgrt_w32_reg_query_string (const char *root,
+                                   const char *dir,
+                                   const char *name);
+
+
+#endif /*HAVE_W32_SYSTEM*/
+
+/*
+ * Missing functions implemented inline.
+ */
+
+#ifndef HAVE_STPCPY
+static GPG_ERR_INLINE char *
+_gpgrt_stpcpy (char *a, const char *b)
+{
+  while (*b)
+    *a++ = *b++;
+  *a = 0;
+  return a;
+}
+#define stpcpy(a,b) _gpgrt_stpcpy ((a), (b))
+#endif /*!HAVE_STPCPY*/
+
+
 #endif /*_GPGRT_GPGRT_INT_H*/
diff --git a/src/logging.c b/src/logging.c
index 2e675f5..dbd8066 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -787,9 +787,9 @@ _gpgrt_logv_internal (int level, int ignore_arg_ptr, const char *extrastring,
 
       tmp = (no_registry
              ? NULL
-             : read_w32_registry_string (NULL, GNUPG_REGISTRY_DIR,
-                                         "DefaultLogFile"));
-      log_set_file (tmp && *tmp? tmp : NULL);
+             : _gpgrt_w32_reg_query_string (NULL, "Software\\\\GNU\\\\GnuPG",
+                                            "DefaultLogFile"));
+      _gpgrt_log_set_sink (tmp && *tmp? tmp : NULL, NULL, -1);
       _gpgrt_free (tmp);
 #else
       /* Make sure a log stream has been set.  */
@@ -1119,7 +1119,7 @@ _gpgrt_logv_printhex (const void *buffer, size_t length,
               cnt = 0;
               /* (we indicate continuations with a backslash) */
               _gpgrt_log_printf (" \\\n");
-              _gpgrt_log_debug ("");
+              _gpgrt_log_debug ("%s", "");
               if (fmt && *fmt)
                 _gpgrt_log_printf (" ");
             }
diff --git a/src/visibility.c b/src/visibility.c
index 888492a..01ed2ce 100644
--- a/src/visibility.c
+++ b/src/visibility.c
@@ -975,3 +975,18 @@ _gpgrt_log_assert (const char *expr, const char *file,
   _gpgrt__log_assert (expr, file, line);
 #endif
 }
+
+
+
+

+/* For consistency reasons we use function wrappers also for Windows
+ * specific function despite that they are technically not needed.  */
+#ifdef HAVE_W32_SYSTEM
+
+char *
+gpgrt_w32_reg_query_string (const char *root, const char *dir, const char *name)
+{
+  return _gpgrt_w32_reg_query_string (root, dir, name);
+}
+
+#endif /*HAVE_W32_SYSTEM*/
diff --git a/src/visibility.h b/src/visibility.h
index c4f4fd1..416f266 100644
--- a/src/visibility.h
+++ b/src/visibility.h
@@ -326,6 +326,11 @@ MARK_VISIBLE (_gpgrt_log_assert)
 #define gpgrt_log_flush             _gpgrt_USE_UNDERSCORED_FUNCTION
 #define _gpgrt_log_assert           _gpgrt_USE_UNDERSCORED_FUNCTION
 
+
+/* Windows specific functions.  */
+#define gpgrt_w32_reg_query_string  _gpgrt_USE_UNDERSCORED_FUNCTION
+
+
 #endif /*!_GPGRT_INCL_BY_VISIBILITY_C*/
 
 #endif /*_GPGRT_VISIBILITY_H*/
diff --git a/src/w32-add.h b/src/w32-add.h
index 5db6500..07e3c7d 100644
--- a/src/w32-add.h
+++ b/src/w32-add.h
@@ -56,3 +56,8 @@ size_t  gpgrt_w32_iconv (gpgrt_w32_iconv_t cd,
 # define iconv_close(a)   gpgrt_w32_iconv_close ((a))
 # define iconv(a,b,c,d,e) gpgrt_w32_iconv ((a),(b),(c),(d),(e))
 #endif /*GPGRT_ENABLE_W32_ICONV_MACROS*/
+
+/* Query a string in the registry.  */
+char *gpgrt_w32_reg_query_string (const char *root,
+                                  const char *dir,
+                                  const char *name);
diff --git a/src/w32-reg.c b/src/w32-reg.c
new file mode 100644
index 0000000..8aefa52
--- /dev/null
+++ b/src/w32-reg.c
@@ -0,0 +1,150 @@
+/* w32-reg.c - Windows registry support
+ * Copyright (C) 2002, 2005, 2010, 2012, 2017 g10 Code GmbH
+ *
+ * This file is part of Libgpg-error.
+ *
+ * Libgpg-error is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgpg-error 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef HAVE_W32_SYSTEM
+# error This module may only be build for Windows.
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <gpg-error.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include "gpgrt-int.h"
+
+
+/* Return a string from the W32 Registry or NULL in case of error.
+ * Caller must release the return value.  A NULL for root is an alias
+ * for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn. */
+char *
+_gpgrt_w32_reg_query_string (const char *root, const char *dir,
+                             const char *name)
+{
+  HKEY root_key, key_handle;
+  DWORD n1, nbytes, type;
+  char *result = NULL;
+
+  if (!root)
+    root_key = HKEY_CURRENT_USER;
+  else if (!strcmp( root, "HKEY_CLASSES_ROOT"))
+    root_key = HKEY_CLASSES_ROOT;
+  else if (!strcmp( root, "HKEY_CURRENT_USER"))
+    root_key = HKEY_CURRENT_USER;
+  else if (!strcmp( root, "HKEY_LOCAL_MACHINE"))
+    root_key = HKEY_LOCAL_MACHINE;
+  else if (!strcmp( root, "HKEY_USERS"))
+    root_key = HKEY_USERS;
+  else if (!strcmp( root, "HKEY_PERFORMANCE_DATA"))
+    root_key = HKEY_PERFORMANCE_DATA;
+  else if (!strcmp( root, "HKEY_CURRENT_CONFIG"))
+    root_key = HKEY_CURRENT_CONFIG;
+  else
+    return NULL;
+
+  if (RegOpenKeyExA (root_key, dir, 0, KEY_READ, &key_handle))
+    {
+      if (root)
+        return NULL; /* No need for a RegClose, so return direct.  */
+      /* It seems to be common practise to fall back to HKLM. */
+      if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
+        return NULL; /* still no need for a RegClose, so return direct */
+    }
+
+  nbytes = 1;
+  if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
+    {
+      if (root)
+        goto leave;
+      /* Try to fallback to HKLM also for a missing value.  */
+      RegCloseKey (key_handle);
+      if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
+        return NULL; /* Nope.  */
+      if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
+        goto leave;
+    }
+  n1 = nbytes + 1;
+  result = xtrymalloc (n1);
+  if (!result)
+    goto leave;
+  if (RegQueryValueExA (key_handle, name, 0, &type, (LPBYTE) result, &n1))
+    {
+      xfree (result);
+      result = NULL;
+      goto leave;
+    }
+  result[nbytes] = 0; /* Make sure it is really a string.  */
+
+#ifndef HAVE_W32CE_SYSTEM /* (Windows CE has no environment.)  */
+  if (type == REG_EXPAND_SZ && strchr (result, '%'))
+    {
+      char *tmp;
+
+      n1 += 1000;
+      tmp = xtrymalloc (n1 + 1);
+      if (!tmp)
+        goto leave;
+      nbytes = ExpandEnvironmentStrings (result, tmp, n1);
+      if (nbytes && nbytes > n1)
+        {
+          xfree (tmp);
+          n1 = nbytes;
+          tmp = xtrymalloc (n1 + 1);
+          if (!tmp)
+            goto leave;
+          nbytes = ExpandEnvironmentStrings (result, tmp, n1);
+          if (nbytes && nbytes > n1) {
+            xfree (tmp); /* Oops - truncated, better don't expand at all. */
+            goto leave;
+          }
+          tmp[nbytes] = 0;
+          xfree (result);
+          result = tmp;
+        }
+      else if (nbytes)  /* Okay, reduce the length. */
+        {
+          tmp[nbytes] = 0;
+          xfree (result);
+          result = xtrymalloc (strlen (tmp)+1);
+          if (!result)
+            result = tmp;
+          else
+            {
+              strcpy (result, tmp);
+              xfree (tmp);
+            }
+        }
+      else  /* Error - don't expand. */
+        {
+          xfree (tmp);
+        }
+    }
+#endif
+
+ leave:
+  RegCloseKey (key_handle);
+  return result;
+}

commit 0d8d46c76a32176be440b062d2501bbb044fb99d
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Nov 17 11:26:03 2017 +0100

    core: New API functions gpgrt_strdup and gpgrt_strconcat.
    
    * src/visibility.c (gpgrt_strdup): New API fucntion.
    (gpgrt_strconcat): New API fucntion.
    * src/visibility.h: Add corresponding macros.
    * src/gpg-error.def.in: Add them.
    * src/gpg-error.vers: Add them.
    * src/gpgrt-int.h (DIM): New macro.
    * src/init.c (_gpgrt_strdup): New.
    (_gpgrt_strconcat_core): New.
    (_gpgrt_strconcat): New.
    --
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/src/gpg-error.def.in b/src/gpg-error.def.in
index a9cfed9..7c39502 100644
--- a/src/gpg-error.def.in
+++ b/src/gpg-error.def.in
@@ -186,5 +186,7 @@ EXPORTS
  gpgrt_realloc                @141
  gpgrt_malloc                 @142
  gpgrt_calloc                 @143
+ gpgrt_strdup                 @144
+ gpgrt_strconcat              @145
 
 ;; end of file with public symbols for Windows.
diff --git a/src/gpg-error.h.in b/src/gpg-error.h.in
index 3e7d59b..66e8d08 100644
--- a/src/gpg-error.h.in
+++ b/src/gpg-error.h.in
@@ -440,6 +440,8 @@ gpg_error_from_syserror (void)
 void *gpgrt_realloc (void *a, size_t n);
 void *gpgrt_malloc (size_t n);
 void *gpgrt_calloc (size_t n, size_t m);
+char *gpgrt_strdup (const char *string);
+char *gpgrt_strconcat (const char *s1, ...) GPGRT_ATTR_SENTINEL(0);
 void gpgrt_free (void *a);
 
 
diff --git a/src/gpg-error.vers b/src/gpg-error.vers
index 6276758..074981b 100644
--- a/src/gpg-error.vers
+++ b/src/gpg-error.vers
@@ -160,6 +160,8 @@ GPG_ERROR_1.0 {
     gpgrt_realloc;
     gpgrt_malloc;
     gpgrt_calloc;
+    gpgrt_strdup;
+    gpgrt_strconcat;
 
   local:
     *;
diff --git a/src/gpgrt-int.h b/src/gpgrt-int.h
index 4db330f..c226e2b 100644
--- a/src/gpgrt-int.h
+++ b/src/gpgrt-int.h
@@ -85,6 +85,14 @@
 #endif /*_GPGRT_NEED_AFLOCAL*/
 
 
+/*
+ * Common helper macros.
+ */
+#ifndef DIM
+# define DIM(array) (sizeof (array) / sizeof (*array))
+#endif
+
+
 

 /*
  * Local error function prototypes.
@@ -103,8 +111,12 @@ void _gpgrt_set_alloc_func (void *(*f)(void *a, size_t n));
 
 void *_gpgrt_realloc (void *a, size_t n);
 void *_gpgrt_malloc (size_t n);
-void _gpgrt_free (void *a);
 void *_gpgrt_calloc (size_t n, size_t m);
+char *_gpgrt_strdup (const char *string);
+char *_gpgrt_strconcat (const char *s1, ...) GPGRT_ATTR_SENTINEL(0);
+void _gpgrt_free (void *a);
+/* The next is only to be used by visibility.c.  */
+char *_gpgrt_strconcat_core (const char *s1, va_list arg_ptr);
 
 const char *_gpg_error_check_version (const char *req_version);
 
diff --git a/src/init.c b/src/init.c
index 0154091..89475d3 100644
--- a/src/init.c
+++ b/src/init.c
@@ -215,6 +215,70 @@ _gpgrt_calloc (size_t n, size_t m)
 }
 
 
+char *
+_gpgrt_strdup (const char *string)
+{
+  size_t len = strlen (string);
+  char *p;
+
+  p = _gpgrt_realloc (NULL, len + 1);
+  if (p)
+    strcpy (p, string);
+  return p;
+}
+
+
+/* Helper for _gpgrt_stdconcat and gpgrt_strconcat.  */
+char *
+_gpgrt_strconcat_core (const char *s1, va_list arg_ptr)
+{
+  const char *argv[48];
+  size_t argc;
+  size_t needed;
+  char *buffer, *p;
+
+  argc = 0;
+  argv[argc++] = s1;
+  needed = strlen (s1);
+  while (((argv[argc] = va_arg (arg_ptr, const char *))))
+    {
+      needed += strlen (argv[argc]);
+      if (argc >= DIM (argv)-1)
+        {
+          _gpg_err_set_errno (EINVAL);
+          return NULL;
+        }
+      argc++;
+    }
+  needed++;
+  buffer = _gpgrt_malloc (needed);
+  if (buffer)
+    {
+      for (p = buffer, argc=0; argv[argc]; argc++)
+        p = stpcpy (p, argv[argc]);
+    }
+  return buffer;
+}
+
+
+char *
+_gpgrt_strconcat (const char *s1, ...)
+{
+  va_list arg_ptr;
+  char *result;
+
+  if (!s1)
+    result = _gpgrt_strdup ("");
+  else
+    {
+      va_start (arg_ptr, s1);
+      result = _gpgrt_strconcat_core (s1, arg_ptr);
+      va_end (arg_ptr);
+    }
+  return result;
+}
+
+
 /* The free to be used for data returned by the public API.  */
 void
 _gpgrt_free (void *a)
diff --git a/src/visibility.c b/src/visibility.c
index 6172769..888492a 100644
--- a/src/visibility.c
+++ b/src/visibility.c
@@ -522,6 +522,29 @@ gpgrt_calloc (size_t n, size_t m)
   return _gpgrt_calloc (n, m);
 }
 
+char *
+gpgrt_strdup (const char *string)
+{
+  return _gpgrt_strdup (string);
+}
+
+char *
+gpgrt_strconcat (const char *s1, ...)
+{
+  va_list arg_ptr;
+  char *result;
+
+  if (!s1)
+    result = _gpgrt_strdup ("");
+  else
+    {
+      va_start (arg_ptr, s1);
+      result = _gpgrt_strconcat_core (s1, arg_ptr);
+      va_end (arg_ptr);
+    }
+  return result;
+}
+
 void
 gpgrt_free (void *a)
 {
diff --git a/src/visibility.h b/src/visibility.h
index 596a6f2..c4f4fd1 100644
--- a/src/visibility.h
+++ b/src/visibility.h
@@ -121,6 +121,8 @@ MARK_VISIBLE (gpgrt_read_line)
 MARK_VISIBLE (gpgrt_realloc)
 MARK_VISIBLE (gpgrt_malloc)
 MARK_VISIBLE (gpgrt_calloc)
+MARK_VISIBLE (gpgrt_strdup)
+MARK_VISIBLE (gpgrt_strconcat)
 MARK_VISIBLE (gpgrt_free)
 MARK_VISIBLE (gpgrt_fprintf)
 MARK_VISIBLE (gpgrt_fprintf_unlocked)
@@ -262,7 +264,9 @@ MARK_VISIBLE (_gpgrt_log_assert)
 #define gpgrt_read_line             _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_realloc               _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_malloc                _gpgrt_USE_UNDERSCORED_FUNCTION
-#define gpgrt_calloc                 _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_calloc                _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_strdup                _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_strconcat             _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_free                  _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_fprintf               _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_fprintf_unlocked      _gpgrt_USE_UNDERSCORED_FUNCTION

commit 80c18e1b212cc91946864db7a53da50e9f91b861
Author: Werner Koch <wk at gnupg.org>
Date:   Fri Nov 17 11:00:39 2017 +0100

    core: New API functions gpgrt_malloc, gpgrt_calloc, and gpgrt_realloc.
    
    * src/visibility.c (gpgrt_realloc): New API function.
    (gpgrt_malloc): New API function.
    (gpgrt_calloc): New API function.
    * src/visibility.h: Add corresponding macros.
    * src/gpg-error.def.in: Add them.
    * src/gpg-error.vers: Add them.
    * src/init.c (_gpgrt_calloc): New.
    * src/gpg-error.h.in: Add prototypes.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/src/gpg-error.def.in b/src/gpg-error.def.in
index b718c7a..a9cfed9 100644
--- a/src/gpg-error.def.in
+++ b/src/gpg-error.def.in
@@ -183,5 +183,8 @@ EXPORTS
  gpgrt_log_flush              @139
  _gpgrt_log_assert            @140
 
+ gpgrt_realloc                @141
+ gpgrt_malloc                 @142
+ gpgrt_calloc                 @143
 
 ;; end of file with public symbols for Windows.
diff --git a/src/gpg-error.h.in b/src/gpg-error.h.in
index 2d515d5..3e7d59b 100644
--- a/src/gpg-error.h.in
+++ b/src/gpg-error.h.in
@@ -434,6 +434,17 @@ gpg_error_from_syserror (void)
 
 

 /*
+ * Malloc and friends
+ */
+
+void *gpgrt_realloc (void *a, size_t n);
+void *gpgrt_malloc (size_t n);
+void *gpgrt_calloc (size_t n, size_t m);
+void gpgrt_free (void *a);
+
+
+

+/*
  * Lock functions.
  */
 
@@ -723,7 +734,6 @@ int gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
 @api_ssize_t@ gpgrt_read_line (gpgrt_stream_t stream,
                          char **addr_of_buffer, size_t *length_of_buffer,
                          size_t *max_length);
-void gpgrt_free (void *a);
 
 int gpgrt_fprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
                    const char *_GPGRT__RESTRICT format, ...)
diff --git a/src/gpg-error.vers b/src/gpg-error.vers
index 6cce976..6276758 100644
--- a/src/gpg-error.vers
+++ b/src/gpg-error.vers
@@ -157,6 +157,9 @@ GPG_ERROR_1.0 {
     gpgrt_log_flush;
     _gpgrt_log_assert;
 
+    gpgrt_realloc;
+    gpgrt_malloc;
+    gpgrt_calloc;
 
   local:
     *;
diff --git a/src/gpgrt-int.h b/src/gpgrt-int.h
index f6f8d0e..4db330f 100644
--- a/src/gpgrt-int.h
+++ b/src/gpgrt-int.h
@@ -104,6 +104,7 @@ void _gpgrt_set_alloc_func (void *(*f)(void *a, size_t n));
 void *_gpgrt_realloc (void *a, size_t n);
 void *_gpgrt_malloc (size_t n);
 void _gpgrt_free (void *a);
+void *_gpgrt_calloc (size_t n, size_t m);
 
 const char *_gpg_error_check_version (const char *req_version);
 
diff --git a/src/init.c b/src/init.c
index b01e089..0154091 100644
--- a/src/init.c
+++ b/src/init.c
@@ -194,6 +194,27 @@ _gpgrt_malloc (size_t n)
 }
 
 
+void *
+_gpgrt_calloc (size_t n, size_t m)
+{
+  size_t bytes;
+  void *p;
+
+  bytes = n * m; /* size_t is unsigned so the behavior on overflow is
+                    defined. */
+  if (m && bytes / m != n)
+    {
+      _gpg_err_set_errno (ENOMEM);
+      return NULL;
+    }
+
+  p = _gpgrt_realloc (NULL, bytes);
+  if (p)
+    memset (p, 0, bytes);
+  return p;
+}
+
+
 /* The free to be used for data returned by the public API.  */
 void
 _gpgrt_free (void *a)
diff --git a/src/visibility.c b/src/visibility.c
index 569c3e6..6172769 100644
--- a/src/visibility.c
+++ b/src/visibility.c
@@ -504,6 +504,24 @@ gpgrt_read_line (estream_t stream,
                            max_length);
 }
 
+void *
+gpgrt_realloc (void *a, size_t n)
+{
+  return _gpgrt_realloc (a, n);
+}
+
+void *
+gpgrt_malloc (size_t n)
+{
+  return _gpgrt_malloc (n);
+}
+
+void *
+gpgrt_calloc (size_t n, size_t m)
+{
+  return _gpgrt_calloc (n, m);
+}
+
 void
 gpgrt_free (void *a)
 {
diff --git a/src/visibility.h b/src/visibility.h
index dca3019..596a6f2 100644
--- a/src/visibility.h
+++ b/src/visibility.h
@@ -118,6 +118,9 @@ MARK_VISIBLE (gpgrt_fputs)
 MARK_VISIBLE (gpgrt_fputs_unlocked)
 MARK_VISIBLE (gpgrt_getline)
 MARK_VISIBLE (gpgrt_read_line)
+MARK_VISIBLE (gpgrt_realloc)
+MARK_VISIBLE (gpgrt_malloc)
+MARK_VISIBLE (gpgrt_calloc)
 MARK_VISIBLE (gpgrt_free)
 MARK_VISIBLE (gpgrt_fprintf)
 MARK_VISIBLE (gpgrt_fprintf_unlocked)
@@ -257,6 +260,9 @@ MARK_VISIBLE (_gpgrt_log_assert)
 #define gpgrt_fputs_unlocked        _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_getline               _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_read_line             _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_realloc               _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_malloc                _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_calloc                 _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_free                  _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_fprintf               _gpgrt_USE_UNDERSCORED_FUNCTION
 #define gpgrt_fprintf_unlocked      _gpgrt_USE_UNDERSCORED_FUNCTION

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

Summary of changes:
 configure.ac         |   2 +-
 src/Makefile.am      |   6 ++-
 src/gpg-error.def.in |   9 ++++
 src/gpg-error.h.in   |  14 ++++-
 src/gpg-error.vers   |   5 ++
 src/gpgrt-int.h      |  50 +++++++++++++++++
 src/init.c           |  85 +++++++++++++++++++++++++++++
 src/logging.c        |   8 +--
 src/visibility.c     |  56 +++++++++++++++++++
 src/visibility.h     |  15 ++++++
 src/w32-add.h        |   5 ++
 src/w32-estream.c    |   8 +++
 src/w32-reg.c        | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++
 13 files changed, 405 insertions(+), 8 deletions(-)
 create mode 100644 src/w32-reg.c


hooks/post-receive
-- 
Error codes used by GnuPG et al.
http://git.gnupg.org




More information about the Gnupg-commits mailing list