summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/base.scm3
-rw-r--r--gnu/packages/patches/diffutils-fix-signal-processing.patch58
3 files changed, 61 insertions, 1 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index b9ace3e0ef..21a462cdc2 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1002,6 +1002,7 @@ dist_patch_DATA = \
%D%/packages/patches/desmume-gcc7-fixes.patch \
%D%/packages/patches/dfu-programmer-fix-libusb.patch \
%D%/packages/patches/diffoscope-fix-llvm-test.patch \
+ %D%/packages/patches/diffutils-fix-signal-processing.patch \
%D%/packages/patches/diffutils-gets-undeclared.patch \
%D%/packages/patches/dkimproxy-add-ipv6-support.patch \
%D%/packages/patches/docbook-xsl-nonrecursive-string-subst.patch \
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index ebbb093eac..9395c7e056 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -274,7 +274,8 @@ differences.")
(sha256
(base32
"09isrg0isjinv8c535nxsi1s86wfdfzml80dbw41dj9x3hiad9xk"))
- (patches (search-patches "coreutils-gnulib-tests.patch"))))
+ (patches (search-patches "coreutils-gnulib-tests.patch"
+ "diffutils-fix-signal-processing.patch"))))
(build-system gnu-build-system)
(native-inputs (list perl))
(synopsis "Comparing and merging files")
diff --git a/gnu/packages/patches/diffutils-fix-signal-processing.patch b/gnu/packages/patches/diffutils-fix-signal-processing.patch
new file mode 100644
index 0000000000..134dd3f718
--- /dev/null
+++ b/gnu/packages/patches/diffutils-fix-signal-processing.patch
@@ -0,0 +1,58 @@
+Author: Frédéric Bonnard <frediz@debian.org>
+
+Obtained from:
+
+https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=922552#19
+
+Fixes bug reported upstream at:
+
+https://debbugs.gnu.org/cgi/bugreport.cgi?bug=34519
+
+diff --git a/src/diff.c b/src/diff.c
+index e2eb32437353..b574e8282dc9 100644
+--- a/src/diff.c
++++ b/src/diff.c
+@@ -1451,6 +1451,8 @@ compare_files (struct comparison const *parent,
+ }
+ }
+
++ final_process_signals ();
++
+ /* Now the comparison has been done, if no error prevented it,
+ and STATUS is the value this function will return. */
+
+diff --git a/src/diff.h b/src/diff.h
+index 03daaa4a0530..e177fe600a25 100644
+--- a/src/diff.h
++++ b/src/diff.h
+@@ -390,6 +390,7 @@ extern enum changes analyze_hunk (struct change *, lin *, lin *, lin *, lin *);
+ extern void begin_output (void);
+ extern void debug_script (struct change *);
+ extern void fatal (char const *) __attribute__((noreturn));
++extern void final_process_signals (void);
+ extern void finish_output (void);
+ extern void message (char const *, char const *, char const *);
+ extern void message5 (char const *, char const *, char const *,
+diff --git a/src/util.c b/src/util.c
+index 4f4d9bb285eb..56d292de2927 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -237,6 +237,18 @@ process_signals (void)
+ }
+ }
+
++/* Process remaining signals once before exit */
++void
++final_process_signals (void)
++{
++ static int last = 1;
++
++ if (last) {
++ process_signals ();
++ last = 0;
++ }
++}
++
+ static void
+ install_signal_handlers (void)
+ {