core: Support non-thread-safe getenv.
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 27 Feb 2018 09:43:40 +0000 (18:43 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 27 Feb 2018 09:43:40 +0000 (18:43 +0900)
* src/get-env.c (_gpgme_getenv): Use gpgrt_lock_lock
and gpgrt_lock_unlock to protect call of getnev.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
src/get-env.c

index 1adbeee..b13706f 100644 (file)
 #include "util.h"
 
 \f
-#if defined(HAVE_THREAD_SAFE_GETENV)
-/* We prefer using getenv() if it is thread-safe.  */
-
 /* Retrieve the environment variable NAME and return a copy of it in a
    malloc()'ed buffer in *VALUE.  If the environment variable is not
    set, return NULL in *VALUE.  */
-gpgme_error_t
-_gpgme_getenv (const char *name, char **value)
-{
-  char *env_value;
 
-  env_value = getenv (name);
-  if (!env_value)
-    *value = NULL;
-  else
-    {
-      *value = strdup (env_value);
-      if (!*value)
-       return gpg_error_from_syserror ();
-    }
-  return 0;
-}
-#elif defined (HAVE_GETENV_R)
+#ifdef HAVE_GETENV_R
 #define INITIAL_GETENV_SIZE 32
 
 gpgme_error_t
@@ -91,7 +73,41 @@ _gpgme_getenv (const char *name, char **value)
   return 0;
 }
 #else
+#ifndef HAVE_THREAD_SAFE_GETENV
+GPGRT_LOCK_DEFINE (environ_lock);
+#endif
+
+gpgme_error_t
+_gpgme_getenv (const char *name, char **value)
+{
+  char *env_value;
+  gpgme_error_t err = 0;
 
-#error No thread-safe getenv nor getenv_r
+#ifndef HAVE_THREAD_SAFE_GETENV
+  gpg_err_code_t rc;
 
+  rc= gpgrt_lock_lock (&environ_lock);
+  if (rc)
+    {
+      err = gpg_error (rc);
+      goto leave;
+    }
+#endif
+  env_value = getenv (name);
+  if (!env_value)
+    *value = NULL;
+  else
+    {
+      *value = strdup (env_value);
+      if (!*value)
+       err = gpg_error_from_syserror ();
+    }
+#ifndef HAVE_THREAD_SAFE_GETENV
+  rc = gpgrt_lock_unlock (&environ_lock);
+  if (rc)
+    err = gpg_error (rc);
+ leave:
+#endif
+  return err;
+}
 #endif