summaryrefslogtreecommitdiff
path: root/libguile/error.c
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2014-11-11 22:30:14 -0500
committerMark H Weaver <mhw@netris.org>2014-11-11 22:36:30 -0500
commitfda17c20a3d088fccab1671c8881bd217d83d5f6 (patch)
treecfae78e498e7f0ef74180508ffe7f383163b9274 /libguile/error.c
parent9c5d6aa9642891e571a7e7a2428c2084fe1058cf (diff)
downloadguile-fda17c20a3d088fccab1671c8881bd217d83d5f6.tar.gz
Fix strerror error handling when given a non-integer argument.
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.
Diffstat (limited to 'libguile/error.c')
-rw-r--r--libguile/error.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/libguile/error.c b/libguile/error.c
index b5565a069..7971046ce 100644
--- a/libguile/error.c
+++ b/libguile/error.c
@@ -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;