62 lines
1.7 KiB
Diff
62 lines
1.7 KiB
Diff
|
commit edf5aea7ac852db2356ef36cba4a119eb0c81ea9
|
||
|
Author: Ludovic Courtès <ludo@gnu.org>
|
||
|
Date: Mon Dec 9 14:44:59 2019 +0100
|
||
|
|
||
|
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.
|
||
|
|
||
|
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 ();
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
}
|