guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

crypt mutex


From: Kevin Ryde
Subject: crypt mutex
Date: Sat, 21 Feb 2004 10:32:53 +1000
User-agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3 (gnu/linux)

While nosing around the crypt function, I wondered if it ought to have
a mutex, just in case two threads run it concurrently.

        * posix.c (crypt_mutex): New variable.
        (scm_init_posix): Initialize it.
        (scm_crypt): Use it to protect static data from crypt().

--- posix.c.~1.124.~    2004-02-21 09:19:52.000000000 +1000
+++ posix.c     2004-02-21 10:30:54.000000000 +1000
@@ -1420,7 +1420,11 @@
 #undef FUNC_NAME
 #endif /* HAVE_SYNC */
 
+/* crypt() returns a pointer to a static buffer, so we use a mutex to avoid
+   another thread overwriting that buffer by another call.
+   OPTIMIZE-ME: Use glibc crypt_r() when available.  */
 #if HAVE_CRYPT
+static scm_t_mutex  crypt_mutex;
 SCM_DEFINE (scm_crypt, "crypt", 2, 0, 0, 
             (SCM key, SCM salt),
            "Encrypt @var{key} using @var{salt} as the salt value to the\n"
@@ -1428,12 +1432,16 @@
 #define FUNC_NAME s_scm_crypt
 {
   char * p;
+  SCM ret;
 
   SCM_VALIDATE_STRING (1, key);
   SCM_VALIDATE_STRING (2, salt);
 
+  scm_mutex_lock (&crypt_mutex);
   p = crypt (SCM_STRING_CHARS (key), SCM_STRING_CHARS (salt));
-  return scm_makfrom0str (p);
+  ret = scm_makfrom0str (p);
+  scm_mutex_unlock (&crypt_mutex);
+  return ret;
 }
 #undef FUNC_NAME
 #endif /* HAVE_CRYPT */
@@ -1826,6 +1834,10 @@
   scm_c_define ("LOCK_NB", SCM_MAKINUM (LOCK_NB));
 #endif
 
+#if HAVE_CRYPT
+  scm_mutex_init (&crypt_mutex, &scm_i_plugin_mutex);
+#endif
+
 #include "libguile/cpp_sig_symbols.c"
 #include "libguile/posix.x"
 }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]