diff --git a/gnu/local.mk b/gnu/local.mk index f1223e2d70..0faa0ba07c 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -948,6 +948,7 @@ dist_patch_DATA = \ %D%/packages/patches/guile-2.2-skip-oom-test.patch \ %D%/packages/patches/guile-default-utf8.patch \ %D%/packages/patches/guile-gdbm-ffi-support-gdbm-1.14.patch \ + %D%/packages/patches/guile-finalization-crash.patch \ %D%/packages/patches/guile-linux-syscalls.patch \ %D%/packages/patches/guile-present-coding.patch \ %D%/packages/patches/guile-relocatable.patch \ diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm index 33968996e6..9df008c413 100644 --- a/gnu/packages/guile.scm +++ b/gnu/packages/guile.scm @@ -250,6 +250,18 @@ (define-public guile-2.2 (variable "GUILE_LOAD_COMPILED_PATH") (files '("lib/guile/2.2/site-ccache"))))))) +(define-public guile-2.2/bug-fix + ;; This variant contains a bug fix for a relatively rare crash that could + ;; affect shepherd as PID 1: . + (package + (inherit guile-2.2) + (version (string-append (package-version guile-2.2) "-1")) + (source (origin + (inherit (package-source guile-2.2)) + (patches + (append (search-patches "guile-finalization-crash.patch") + (origin-patches (package-source guile-2.2)))))))) + (define-public guile-2.2/fixed ;; A package of Guile 2.2 that's rarely changed. It is the one used ;; in the `base' module, and thus changing it entails a full rebuild. diff --git a/gnu/packages/patches/guile-finalization-crash.patch b/gnu/packages/patches/guile-finalization-crash.patch new file mode 100644 index 0000000000..098249e49f --- /dev/null +++ b/gnu/packages/patches/guile-finalization-crash.patch @@ -0,0 +1,61 @@ +commit edf5aea7ac852db2356ef36cba4a119eb0c81ea9 +Author: Ludovic Courtès +Date: Mon Dec 9 14:44:59 2019 +0100 + + Fix non-deterministic crash in 'finalization_thread_proc'. + + Fixes . + Reported by Jesse Gibbons . + + * 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 (); ++ } + } + } + }