summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-12-09 14:44:59 +0100
committerLudovic Courtès <ludo@gnu.org>2019-12-09 14:44:59 +0100
commitedf5aea7ac852db2356ef36cba4a119eb0c81ea9 (patch)
tree33948db7cc9be3e026138b3767249ee00c7a53c4
parent659526d33b2db1b0924b2769b6a0b824709860cc (diff)
Fix non-deterministic crash in 'finalization_thread_proc'.
Fixes <https://bugs.gnu.org/37757>. Reported by Jesse Gibbons <jgibbons2357@gmail.com>. * libguile/finalizers.c (finalization_thread_proc): Do not enter the "switch (data.byte)" condition when data.n <= 0.
-rw-r--r--libguile/finalizers.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/libguile/finalizers.c b/libguile/finalizers.c
index c5d69e8e3..94a6e6b0a 100644
--- a/libguile/finalizers.c
+++ b/libguile/finalizers.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012, 2013, 2014 Free Software Foundation, Inc.
+/* Copyright (C) 2012, 2013, 2014, 2019 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
@@ -211,21 +211,26 @@ finalization_thread_proc (void *unused)
scm_without_guile (read_finalization_pipe_data, &data);
- if (data.n <= 0 && data.err != EINTR)
+ if (data.n <= 0)
{
- perror ("error in finalization thread");
- return NULL;
+ if (data.err != EINTR)
+ {
+ perror ("error in finalization thread");
+ return NULL;
+ }
}
-
- switch (data.byte)
+ else
{
- case 0:
- scm_run_finalizers ();
- break;
- case 1:
- return NULL;
- default:
- abort ();
+ switch (data.byte)
+ {
+ case 0:
+ scm_run_finalizers ();
+ break;
+ case 1:
+ return NULL;
+ default:
+ abort ();
+ }
}
}
}