Fix strerror error handling when given a non-integer argument.
authorMark H Weaver <mhw@netris.org>
Wed, 12 Nov 2014 03:30:14 +0000 (22:30 -0500)
committerMark H Weaver <mhw@netris.org>
Wed, 12 Nov 2014 03:36:30 +0000 (22:36 -0500)
Fixes <http://bugs.gnu.org/18065>.
Reported and fixed by Glenn Michaels <gmichaels@Safe-mail.net>.

* libguile/error.c (scm_strerror): Convert the argument to a C integer
  outside of the critical section, to avoid deadlock on error.
* THANKS: Add Glenn Michaels to the fixes section.

THANKS
libguile/error.c

diff --git a/THANKS b/THANKS
index 1aeb4a4..d5e8222 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -134,6 +134,7 @@ For fixes or providing information which led to a fix:
             Dan McMahill
           Roger Mc Murtrie
           Scott McPeak
+          Glenn Michaels
          Andrew Milkowski
             Tim Mooney
         Han-Wen Nienhuys
index b5565a0..7971046 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001, 2004, 2006, 2010,
- *   2012, 2013, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1998, 2000, 2001, 2004, 2006, 2010, 2012-2014
+ *   Free Software Foundation, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -121,10 +121,13 @@ SCM_DEFINE (scm_strerror, "strerror", 1, 0, 0,
 #define FUNC_NAME s_scm_strerror
 {
   SCM ret;
+  int errnum = scm_to_int (err);  /* Must be done outside of the
+                                    critical section below, to avoid a
+                                    deadlock on errors.  */
   scm_dynwind_begin (0);
   scm_i_dynwind_pthread_mutex_lock (&scm_i_misc_mutex);
 
-  ret = scm_from_locale_string (strerror (scm_to_int (err)));
+  ret = scm_from_locale_string (strerror (errnum));
 
   scm_dynwind_end ();
   return ret;