* 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 ();
 | |
| +            }
 | |
|          }
 | |
|      }
 | |
|  }
 |