* gnu/packages/patches/guile-finalization-crash.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/guile.scm (guile-2.2/bug-fix): New variable.
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			61 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 ();
 | 
						|
+            }
 | 
						|
         }
 | 
						|
     }
 | 
						|
 }
 |