diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-12-09 14:44:59 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-12-09 14:44:59 +0100 |
commit | edf5aea7ac852db2356ef36cba4a119eb0c81ea9 (patch) | |
tree | 33948db7cc9be3e026138b3767249ee00c7a53c4 | |
parent | 659526d33b2db1b0924b2769b6a0b824709860cc (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.c | 31 |
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 (); + } } } } |