aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/patches
diff options
context:
space:
mode:
authorMarius Bakke <mbakke@fastmail.com>2020-01-03 19:41:05 +0100
committerMarius Bakke <mbakke@fastmail.com>2020-01-03 19:41:05 +0100
commit982eff9e841f3539e4ecf93669435a290bfde571 (patch)
treeb1e3f6fc85c6c35c264f091eb2fc5cff8514c230 /gnu/packages/patches
parent7ba6d70e4528201151195e1ed2175ee4828bdb2f (diff)
parent7158fe4ded47a599ceb8d556132ba83fcc686962 (diff)
downloadguix-982eff9e841f3539e4ecf93669435a290bfde571.tar
guix-982eff9e841f3539e4ecf93669435a290bfde571.tar.gz
Merge branch 'master' into staging
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r--gnu/packages/patches/audiofile-CVE-2015-7747.patch156
-rw-r--r--gnu/packages/patches/audiofile-CVE-2018-13440.patch28
-rw-r--r--gnu/packages/patches/audiofile-CVE-2018-17095.patch26
-rw-r--r--gnu/packages/patches/audiofile-Check-the-number-of-coefficients.patch30
-rw-r--r--gnu/packages/patches/audiofile-Fail-on-error-in-parseFormat.patch36
-rw-r--r--gnu/packages/patches/audiofile-Fix-index-overflow-in-IMA.cpp.patch33
-rw-r--r--gnu/packages/patches/audiofile-Fix-multiply-overflow-sfconvert.patch66
-rw-r--r--gnu/packages/patches/audiofile-Fix-overflow-in-MSADPCM-decodeSam.patch116
-rw-r--r--gnu/packages/patches/audiofile-division-by-zero-BlockCodec-runPull.patch21
-rw-r--r--gnu/packages/patches/audiofile-fix-datatypes-in-tests.patch54
-rw-r--r--gnu/packages/patches/audiofile-fix-sign-conversion.patch26
-rw-r--r--gnu/packages/patches/audiofile-hurd.patch381
-rw-r--r--gnu/packages/patches/audiofile-signature-of-multiplyCheckOverflow.patch35
-rw-r--r--gnu/packages/patches/emacs27-exec-path.patch18
-rw-r--r--gnu/packages/patches/gcc-7-cross-environment-variables.patch67
-rw-r--r--gnu/packages/patches/grantlee-merge-theme-dirs.patch163
-rw-r--r--gnu/packages/patches/hexchat-crash-exit.patch31
-rw-r--r--gnu/packages/patches/jfsutils-add-sysmacros.patch26
-rw-r--r--gnu/packages/patches/jfsutils-include-systypes.patch25
-rw-r--r--gnu/packages/patches/kmplayer-aarch64.patch57
-rw-r--r--gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch42
-rw-r--r--gnu/packages/patches/libgeotiff-adapt-test-script-for-proj-6.2.patch63
-rw-r--r--gnu/packages/patches/linux-libre-active-entropy.patch86
-rw-r--r--gnu/packages/patches/mumble-1.2.19-abs.patch31
24 files changed, 1469 insertions, 148 deletions
diff --git a/gnu/packages/patches/audiofile-CVE-2015-7747.patch b/gnu/packages/patches/audiofile-CVE-2015-7747.patch
new file mode 100644
index 0000000000..3325639591
--- /dev/null
+++ b/gnu/packages/patches/audiofile-CVE-2015-7747.patch
@@ -0,0 +1,156 @@
+Description: fix buffer overflow when changing both sample format and
+ number of channels
+Origin: https://github.com/mpruett/audiofile/pull/25
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/audiofile/+bug/1502721
+Bug-Debian: https://bugs.debian.org/801102
+
+--- a/libaudiofile/modules/ModuleState.cpp
++++ b/libaudiofile/modules/ModuleState.cpp
+@@ -402,7 +402,7 @@ status ModuleState::arrange(AFfilehandle
+ addModule(new Transform(outfc, in.pcm, out.pcm));
+
+ if (in.channelCount != out.channelCount)
+- addModule(new ApplyChannelMatrix(infc, isReading,
++ addModule(new ApplyChannelMatrix(outfc, isReading,
+ in.channelCount, out.channelCount,
+ in.pcm.minClip, in.pcm.maxClip,
+ track->channelMatrix));
+--- a/test/Makefile.am
++++ b/test/Makefile.am
+@@ -26,6 +26,7 @@ TESTS = \
+ VirtualFile \
+ floatto24 \
+ query2 \
++ sixteen-stereo-to-eight-mono \
+ sixteen-to-eight \
+ testchannelmatrix \
+ testdouble \
+@@ -139,6 +140,7 @@ printmarkers_SOURCES = printmarkers.c
+ printmarkers_LDADD = $(LIBAUDIOFILE) -lm
+
+ sixteen_to_eight_SOURCES = sixteen-to-eight.c TestUtilities.cpp TestUtilities.h
++sixteen_stereo_to_eight_mono_SOURCES = sixteen-stereo-to-eight-mono.c TestUtilities.cpp TestUtilities.h
+
+ testchannelmatrix_SOURCES = testchannelmatrix.c TestUtilities.cpp TestUtilities.h
+
+--- /dev/null
++++ b/test/sixteen-stereo-to-eight-mono.c
+@@ -0,0 +1,118 @@
++/*
++ Audio File Library
++
++ Copyright 2000, Silicon Graphics, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++*/
++
++/*
++ sixteen-stereo-to-eight-mono.c
++
++ This program tests the conversion from 2-channel 16-bit integers to
++ 1-channel 8-bit integers.
++*/
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <limits.h>
++
++#include <audiofile.h>
++
++#include "TestUtilities.h"
++
++int main (int argc, char **argv)
++{
++ AFfilehandle file;
++ AFfilesetup setup;
++ int16_t frames16[] = {14298, 392, 3923, -683, 958, -1921};
++ int8_t frames8[] = {28, 6, -2};
++ int i, frameCount = 3;
++ int8_t byte;
++ AFframecount result;
++
++ setup = afNewFileSetup();
++
++ afInitFileFormat(setup, AF_FILE_WAVE);
++
++ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16);
++ afInitChannels(setup, AF_DEFAULT_TRACK, 2);
++
++ char *testFileName;
++ if (!createTemporaryFile("sixteen-to-eight", &testFileName))
++ {
++ fprintf(stderr, "Could not create temporary file.\n");
++ exit(EXIT_FAILURE);
++ }
++
++ file = afOpenFile(testFileName, "w", setup);
++ if (file == AF_NULL_FILEHANDLE)
++ {
++ fprintf(stderr, "could not open file for writing\n");
++ exit(EXIT_FAILURE);
++ }
++
++ afFreeFileSetup(setup);
++
++ afWriteFrames(file, AF_DEFAULT_TRACK, frames16, frameCount);
++
++ afCloseFile(file);
++
++ file = afOpenFile(testFileName, "r", AF_NULL_FILESETUP);
++ if (file == AF_NULL_FILEHANDLE)
++ {
++ fprintf(stderr, "could not open file for reading\n");
++ exit(EXIT_FAILURE);
++ }
++
++ afSetVirtualSampleFormat(file, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 8);
++ afSetVirtualChannels(file, AF_DEFAULT_TRACK, 1);
++
++ for (i=0; i<frameCount; i++)
++ {
++ /* Read one frame. */
++ result = afReadFrames(file, AF_DEFAULT_TRACK, &byte, 1);
++
++ if (result != 1)
++ break;
++
++ /* Compare the byte read with its precalculated value. */
++ if (memcmp(&byte, &frames8[i], 1) != 0)
++ {
++ printf("error\n");
++ printf("expected %d, got %d\n", frames8[i], byte);
++ exit(EXIT_FAILURE);
++ }
++ else
++ {
++#ifdef DEBUG
++ printf("got what was expected: %d\n", byte);
++#endif
++ }
++ }
++
++ afCloseFile(file);
++ unlink(testFileName);
++ free(testFileName);
++
++ exit(EXIT_SUCCESS);
++}
diff --git a/gnu/packages/patches/audiofile-CVE-2018-13440.patch b/gnu/packages/patches/audiofile-CVE-2018-13440.patch
new file mode 100644
index 0000000000..ffd65b43b0
--- /dev/null
+++ b/gnu/packages/patches/audiofile-CVE-2018-13440.patch
@@ -0,0 +1,28 @@
+From fde6d79fb8363c4a329a184ef0b107156602b225 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Thu, 27 Sep 2018 10:48:45 +0200
+Subject: [PATCH] ModuleState: handle compress/decompress init failure
+
+When the unit initcompress or initdecompress function fails,
+m_fileModule is NULL. Return AF_FAIL in that case instead of
+causing NULL pointer dereferences later.
+
+Fixes #49
+---
+ libaudiofile/modules/ModuleState.cpp | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/libaudiofile/modules/ModuleState.cpp b/libaudiofile/modules/ModuleState.cpp
+index 0c29d7a..070fd9b 100644
+--- a/libaudiofile/modules/ModuleState.cpp
++++ b/libaudiofile/modules/ModuleState.cpp
+@@ -75,6 +75,9 @@ status ModuleState::initFileModule(AFfilehandle file, Track *track)
+ m_fileModule = unit->initcompress(track, file->m_fh, file->m_seekok,
+ file->m_fileFormat == AF_FILE_RAWDATA, &chunkFrames);
+
++ if (!m_fileModule)
++ return AF_FAIL;
++
+ if (unit->needsRebuffer)
+ {
+ assert(unit->nativeSampleFormat == AF_SAMPFMT_TWOSCOMP);
diff --git a/gnu/packages/patches/audiofile-CVE-2018-17095.patch b/gnu/packages/patches/audiofile-CVE-2018-17095.patch
new file mode 100644
index 0000000000..231021b9fc
--- /dev/null
+++ b/gnu/packages/patches/audiofile-CVE-2018-17095.patch
@@ -0,0 +1,26 @@
+From 822b732fd31ffcb78f6920001e9b1fbd815fa712 Mon Sep 17 00:00:00 2001
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Thu, 27 Sep 2018 12:11:12 +0200
+Subject: [PATCH] SimpleModule: set output chunk framecount after pull
+
+After pulling the data, set the output chunk to the amount of
+frames we pulled so that the next module in the chain has the correct
+frame count.
+
+Fixes #50 and #51
+---
+ libaudiofile/modules/SimpleModule.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/libaudiofile/modules/SimpleModule.cpp b/libaudiofile/modules/SimpleModule.cpp
+index 2bae1eb..e87932c 100644
+--- a/libaudiofile/modules/SimpleModule.cpp
++++ b/libaudiofile/modules/SimpleModule.cpp
+@@ -26,6 +26,7 @@
+ void SimpleModule::runPull()
+ {
+ pull(m_outChunk->frameCount);
++ m_outChunk->frameCount = m_inChunk->frameCount;
+ run(*m_inChunk, *m_outChunk);
+ }
+
diff --git a/gnu/packages/patches/audiofile-Check-the-number-of-coefficients.patch b/gnu/packages/patches/audiofile-Check-the-number-of-coefficients.patch
new file mode 100644
index 0000000000..f9427cbe61
--- /dev/null
+++ b/gnu/packages/patches/audiofile-Check-the-number-of-coefficients.patch
@@ -0,0 +1,30 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Mon, 6 Mar 2017 12:51:22 +0100
+Subject: Always check the number of coefficients
+
+When building the library with NDEBUG, asserts are eliminated
+so it's better to always check that the number of coefficients
+is inside the array range.
+
+This fixes the 00191-audiofile-indexoob issue in #41
+---
+ libaudiofile/WAVE.cpp | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/libaudiofile/WAVE.cpp b/libaudiofile/WAVE.cpp
+index 9dd8511..0fc48e8 100644
+--- a/libaudiofile/WAVE.cpp
++++ b/libaudiofile/WAVE.cpp
+@@ -281,6 +281,12 @@ status WAVEFile::parseFormat(const Tag &id, uint32_t size)
+
+ /* numCoefficients should be at least 7. */
+ assert(numCoefficients >= 7 && numCoefficients <= 255);
++ if (numCoefficients < 7 || numCoefficients > 255)
++ {
++ _af_error(AF_BAD_HEADER,
++ "Bad number of coefficients");
++ return AF_FAIL;
++ }
+
+ m_msadpcmNumCoefficients = numCoefficients;
+
diff --git a/gnu/packages/patches/audiofile-Fail-on-error-in-parseFormat.patch b/gnu/packages/patches/audiofile-Fail-on-error-in-parseFormat.patch
new file mode 100644
index 0000000000..50cd3dc9a3
--- /dev/null
+++ b/gnu/packages/patches/audiofile-Fail-on-error-in-parseFormat.patch
@@ -0,0 +1,36 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Mon, 6 Mar 2017 18:59:26 +0100
+Subject: Actually fail when error occurs in parseFormat
+
+When there's an unsupported number of bits per sample or an invalid
+number of samples per block, don't only print an error message using
+the error handler, but actually stop parsing the file.
+
+This fixes #35 (also reported at
+https://bugzilla.opensuse.org/show_bug.cgi?id=1026983 and
+https://blogs.gentoo.org/ago/2017/02/20/audiofile-heap-based-buffer-overflow-in-imadecodeblockwave-ima-cpp/
+)
+---
+ libaudiofile/WAVE.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/libaudiofile/WAVE.cpp b/libaudiofile/WAVE.cpp
+index 0fc48e8..d04b796 100644
+--- a/libaudiofile/WAVE.cpp
++++ b/libaudiofile/WAVE.cpp
+@@ -332,6 +332,7 @@ status WAVEFile::parseFormat(const Tag &id, uint32_t size)
+ {
+ _af_error(AF_BAD_NOT_IMPLEMENTED,
+ "IMA ADPCM compression supports only 4 bits per sample");
++ return AF_FAIL;
+ }
+
+ int bytesPerBlock = (samplesPerBlock + 14) / 8 * 4 * channelCount;
+@@ -339,6 +340,7 @@ status WAVEFile::parseFormat(const Tag &id, uint32_t size)
+ {
+ _af_error(AF_BAD_CODEC_CONFIG,
+ "Invalid samples per block for IMA ADPCM compression");
++ return AF_FAIL;
+ }
+
+ track->f.sampleWidth = 16;
diff --git a/gnu/packages/patches/audiofile-Fix-index-overflow-in-IMA.cpp.patch b/gnu/packages/patches/audiofile-Fix-index-overflow-in-IMA.cpp.patch
new file mode 100644
index 0000000000..c1047af06c
--- /dev/null
+++ b/gnu/packages/patches/audiofile-Fix-index-overflow-in-IMA.cpp.patch
@@ -0,0 +1,33 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Mon, 6 Mar 2017 18:02:31 +0100
+Subject: clamp index values to fix index overflow in IMA.cpp
+
+This fixes #33
+(also reported at https://bugzilla.opensuse.org/show_bug.cgi?id=1026981
+and https://blogs.gentoo.org/ago/2017/02/20/audiofile-global-buffer-overflow-in-decodesample-ima-cpp/)
+---
+ libaudiofile/modules/IMA.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libaudiofile/modules/IMA.cpp b/libaudiofile/modules/IMA.cpp
+index 7476d44..df4aad6 100644
+--- a/libaudiofile/modules/IMA.cpp
++++ b/libaudiofile/modules/IMA.cpp
+@@ -169,7 +169,7 @@ int IMA::decodeBlockWAVE(const uint8_t *encoded, int16_t *decoded)
+ if (encoded[1] & 0x80)
+ m_adpcmState[c].previousValue -= 0x10000;
+
+- m_adpcmState[c].index = encoded[2];
++ m_adpcmState[c].index = clamp(encoded[2], 0, 88);
+
+ *decoded++ = m_adpcmState[c].previousValue;
+
+@@ -210,7 +210,7 @@ int IMA::decodeBlockQT(const uint8_t *encoded, int16_t *decoded)
+ predictor -= 0x10000;
+
+ state.previousValue = clamp(predictor, MIN_INT16, MAX_INT16);
+- state.index = encoded[1] & 0x7f;
++ state.index = clamp(encoded[1] & 0x7f, 0, 88);
+ encoded += 2;
+
+ for (int n=0; n<m_framesPerPacket; n+=2)
diff --git a/gnu/packages/patches/audiofile-Fix-multiply-overflow-sfconvert.patch b/gnu/packages/patches/audiofile-Fix-multiply-overflow-sfconvert.patch
new file mode 100644
index 0000000000..0f17140d6b
--- /dev/null
+++ b/gnu/packages/patches/audiofile-Fix-multiply-overflow-sfconvert.patch
@@ -0,0 +1,66 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Mon, 6 Mar 2017 13:54:52 +0100
+Subject: Check for multiplication overflow in sfconvert
+
+Checks that a multiplication doesn't overflow when
+calculating the buffer size, and if it overflows,
+reduce the buffer size instead of failing.
+
+This fixes the 00192-audiofile-signintoverflow-sfconvert case
+in #41
+---
+ sfcommands/sfconvert.c | 34 ++++++++++++++++++++++++++++++++--
+ 1 file changed, 32 insertions(+), 2 deletions(-)
+
+diff --git a/sfcommands/sfconvert.c b/sfcommands/sfconvert.c
+index 80a1bc4..970a3e4 100644
+--- a/sfcommands/sfconvert.c
++++ b/sfcommands/sfconvert.c
+@@ -45,6 +45,33 @@ void printusage (void);
+ void usageerror (void);
+ bool copyaudiodata (AFfilehandle infile, AFfilehandle outfile, int trackid);
+
++int firstBitSet(int x)
++{
++ int position=0;
++ while (x!=0)
++ {
++ x>>=1;
++ ++position;
++ }
++ return position;
++}
++
++#ifndef __has_builtin
++#define __has_builtin(x) 0
++#endif
++
++int multiplyCheckOverflow(int a, int b, int *result)
++{
++#if (defined __GNUC__ && __GNUC__ >= 5) || ( __clang__ && __has_builtin(__builtin_mul_overflow))
++ return __builtin_mul_overflow(a, b, result);
++#else
++ if (firstBitSet(a)+firstBitSet(b)>31) // int is signed, so we can't use 32 bits
++ return true;
++ *result = a * b;
++ return false;
++#endif
++}
++
+ int main (int argc, char **argv)
+ {
+ if (argc == 2)
+@@ -323,8 +350,11 @@ bool copyaudiodata (AFfilehandle infile, AFfilehandle outfile, int trackid)
+ {
+ int frameSize = afGetVirtualFrameSize(infile, trackid, 1);
+
+- const int kBufferFrameCount = 65536;
+- void *buffer = malloc(kBufferFrameCount * frameSize);
++ int kBufferFrameCount = 65536;
++ int bufferSize;
++ while (multiplyCheckOverflow(kBufferFrameCount, frameSize, &bufferSize))
++ kBufferFrameCount /= 2;
++ void *buffer = malloc(bufferSize);
+
+ AFframecount totalFrames = afGetFrameCount(infile, AF_DEFAULT_TRACK);
+ AFframecount totalFramesWritten = 0;
diff --git a/gnu/packages/patches/audiofile-Fix-overflow-in-MSADPCM-decodeSam.patch b/gnu/packages/patches/audiofile-Fix-overflow-in-MSADPCM-decodeSam.patch
new file mode 100644
index 0000000000..2be930b924
--- /dev/null
+++ b/gnu/packages/patches/audiofile-Fix-overflow-in-MSADPCM-decodeSam.patch
@@ -0,0 +1,116 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Mon, 6 Mar 2017 13:43:53 +0100
+Subject: Check for multiplication overflow in MSADPCM decodeSample
+
+Check for multiplication overflow (using __builtin_mul_overflow
+if available) in MSADPCM.cpp decodeSample and return an empty
+decoded block if an error occurs.
+
+This fixes the 00193-audiofile-signintoverflow-MSADPCM case of #41
+---
+ libaudiofile/modules/BlockCodec.cpp | 5 ++--
+ libaudiofile/modules/MSADPCM.cpp | 47 +++++++++++++++++++++++++++++++++----
+ 2 files changed, 46 insertions(+), 6 deletions(-)
+
+diff --git a/libaudiofile/modules/BlockCodec.cpp b/libaudiofile/modules/BlockCodec.cpp
+index 45925e8..4731be1 100644
+--- a/libaudiofile/modules/BlockCodec.cpp
++++ b/libaudiofile/modules/BlockCodec.cpp
+@@ -52,8 +52,9 @@ void BlockCodec::runPull()
+ // Decompress into m_outChunk.
+ for (int i=0; i<blocksRead; i++)
+ {
+- decodeBlock(static_cast<const uint8_t *>(m_inChunk->buffer) + i * m_bytesPerPacket,
+- static_cast<int16_t *>(m_outChunk->buffer) + i * m_framesPerPacket * m_track->f.channelCount);
++ if (decodeBlock(static_cast<const uint8_t *>(m_inChunk->buffer) + i * m_bytesPerPacket,
++ static_cast<int16_t *>(m_outChunk->buffer) + i * m_framesPerPacket * m_track->f.channelCount)==0)
++ break;
+
+ framesRead += m_framesPerPacket;
+ }
+diff --git a/libaudiofile/modules/MSADPCM.cpp b/libaudiofile/modules/MSADPCM.cpp
+index 8ea3c85..ef9c38c 100644
+--- a/libaudiofile/modules/MSADPCM.cpp
++++ b/libaudiofile/modules/MSADPCM.cpp
+@@ -101,24 +101,60 @@ static const int16_t adaptationTable[] =
+ 768, 614, 512, 409, 307, 230, 230, 230
+ };
+
++int firstBitSet(int x)
++{
++ int position=0;
++ while (x!=0)
++ {
++ x>>=1;
++ ++position;
++ }
++ return position;
++}
++
++#ifndef __has_builtin
++#define __has_builtin(x) 0
++#endif
++
++int multiplyCheckOverflow(int a, int b, int *result)
++{
++#if (defined __GNUC__ && __GNUC__ >= 5) || ( __clang__ && __has_builtin(__builtin_mul_overflow))
++ return __builtin_mul_overflow(a, b, result);
++#else
++ if (firstBitSet(a)+firstBitSet(b)>31) // int is signed, so we can't use 32 bits
++ return true;
++ *result = a * b;
++ return false;
++#endif
++}
++
++
+ // Compute a linear PCM value from the given differential coded value.
+ static int16_t decodeSample(ms_adpcm_state &state,
+- uint8_t code, const int16_t *coefficient)
++ uint8_t code, const int16_t *coefficient, bool *ok=NULL)
+ {
+ int linearSample = (state.sample1 * coefficient[0] +
+ state.sample2 * coefficient[1]) >> 8;
++ int delta;
+
+ linearSample += ((code & 0x08) ? (code - 0x10) : code) * state.delta;
+
+ linearSample = clamp(linearSample, MIN_INT16, MAX_INT16);
+
+- int delta = (state.delta * adaptationTable[code]) >> 8;
++ if (multiplyCheckOverflow(state.delta, adaptationTable[code], &delta))
++ {
++ if (ok) *ok=false;
++ _af_error(AF_BAD_COMPRESSION, "Error decoding sample");
++ return 0;
++ }
++ delta >>= 8;
+ if (delta < 16)
+ delta = 16;
+
+ state.delta = delta;
+ state.sample2 = state.sample1;
+ state.sample1 = linearSample;
++ if (ok) *ok=true;
+
+ return static_cast<int16_t>(linearSample);
+ }
+@@ -212,13 +248,16 @@ int MSADPCM::decodeBlock(const uint8_t *encoded, int16_t *decoded)
+ {
+ uint8_t code;
+ int16_t newSample;
++ bool ok;
+
+ code = *encoded >> 4;
+- newSample = decodeSample(*state[0], code, coefficient[0]);
++ newSample = decodeSample(*state[0], code, coefficient[0], &ok);
++ if (!ok) return 0;
+ *decoded++ = newSample;
+
+ code = *encoded & 0x0f;
+- newSample = decodeSample(*state[1], code, coefficient[1]);
++ newSample = decodeSample(*state[1], code, coefficient[1], &ok);
++ if (!ok) return 0;
+ *decoded++ = newSample;
+
+ encoded++;
diff --git a/gnu/packages/patches/audiofile-division-by-zero-BlockCodec-runPull.patch b/gnu/packages/patches/audiofile-division-by-zero-BlockCodec-runPull.patch
new file mode 100644
index 0000000000..e001133916
--- /dev/null
+++ b/gnu/packages/patches/audiofile-division-by-zero-BlockCodec-runPull.patch
@@ -0,0 +1,21 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Thu, 9 Mar 2017 10:21:18 +0100
+Subject: Check for division by zero in BlockCodec::runPull
+
+---
+ libaudiofile/modules/BlockCodec.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libaudiofile/modules/BlockCodec.cpp b/libaudiofile/modules/BlockCodec.cpp
+index 4731be1..eb2fb4d 100644
+--- a/libaudiofile/modules/BlockCodec.cpp
++++ b/libaudiofile/modules/BlockCodec.cpp
+@@ -47,7 +47,7 @@ void BlockCodec::runPull()
+
+ // Read the compressed data.
+ ssize_t bytesRead = read(m_inChunk->buffer, m_bytesPerPacket * blockCount);
+- int blocksRead = bytesRead >= 0 ? bytesRead / m_bytesPerPacket : 0;
++ int blocksRead = (bytesRead >= 0 && m_bytesPerPacket > 0) ? bytesRead / m_bytesPerPacket : 0;
+
+ // Decompress into m_outChunk.
+ for (int i=0; i<blocksRead; i++)
diff --git a/gnu/packages/patches/audiofile-fix-datatypes-in-tests.patch b/gnu/packages/patches/audiofile-fix-datatypes-in-tests.patch
new file mode 100644
index 0000000000..00e0f3c4a3
--- /dev/null
+++ b/gnu/packages/patches/audiofile-fix-datatypes-in-tests.patch
@@ -0,0 +1,54 @@
+Based on (hunks for changelog and Identy.cpp removed)
+From ecbc07f0ed336187cc9a67c3363f89681b8b8f52 Mon Sep 17 00:00:00 2001
+From: Michael Pruett <michael@68k.org>
+Date: Tue, 5 Jul 2016 23:26:16 -0500
+Subject: [PATCH] Fix type of test data arrays.
+
+
+
+
+---
+ ChangeLog | 6 ++++++
+ test/Identify.cpp | 3 ++-
+ test/NeXT.cpp | 7 ++++---
+ 3 files changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/test/NeXT.cpp b/test/NeXT.cpp
+index 7e39850..29af877 100644
+--- a/test/NeXT.cpp
++++ b/test/NeXT.cpp
+@@ -30,6 +30,7 @@
+ #include <audiofile.h>
+ #include <fcntl.h>
+ #include <gtest/gtest.h>
++#include <stdint.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -37,7 +38,7 @@
+
+ #include "TestUtilities.h"
+
+-const char kDataUnspecifiedLength[] =
++const uint8_t kDataUnspecifiedLength[] =
+ {
+ '.', 's', 'n', 'd',
+ 0, 0, 0, 24, // offset of 24 bytes
+@@ -57,7 +58,7 @@ const char kDataUnspecifiedLength[] =
+ 0, 55
+ };
+
+-const char kDataTruncated[] =
++const uint8_t kDataTruncated[] =
+ {
+ '.', 's', 'n', 'd',
+ 0, 0, 0, 24, // offset of 24 bytes
+@@ -152,7 +153,7 @@ TEST(NeXT, Truncated)
+ ASSERT_EQ(::unlink(testFileName.c_str()), 0);
+ }
+
+-const char kDataZeroChannels[] =
++const uint8_t kDataZeroChannels[] =
+ {
+ '.', 's', 'n', 'd',
+ 0, 0, 0, 24, // offset of 24 bytes
diff --git a/gnu/packages/patches/audiofile-fix-sign-conversion.patch b/gnu/packages/patches/audiofile-fix-sign-conversion.patch
new file mode 100644
index 0000000000..648161d620
--- /dev/null
+++ b/gnu/packages/patches/audiofile-fix-sign-conversion.patch
@@ -0,0 +1,26 @@
+Based on (hunk for changelog removed)
+From b62c902dd258125cac86cd2df21fc898035a43d3 Mon Sep 17 00:00:00 2001
+From: Michael Pruett <michael@68k.org>
+Date: Mon, 29 Aug 2016 23:08:26 -0500
+Subject: [PATCH] Fix undefined behavior in sign conversion.
+
+
+---
+ ChangeLog | 5 +++++
+ libaudiofile/modules/SimpleModule.h | 3 ++-
+ 2 files changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/libaudiofile/modules/SimpleModule.h b/libaudiofile/modules/SimpleModule.h
+index 03c6c69..bad85ad 100644
+--- a/libaudiofile/modules/SimpleModule.h
++++ b/libaudiofile/modules/SimpleModule.h
+@@ -123,7 +123,8 @@ struct signConverter
+ typedef typename IntTypes<Format>::UnsignedType UnsignedType;
+
+ static const int kScaleBits = (Format + 1) * CHAR_BIT - 1;
+- static const int kMinSignedValue = -1 << kScaleBits;
++ static const int kMaxSignedValue = (((1 << (kScaleBits - 1)) - 1) << 1) + 1;
++ static const int kMinSignedValue = -kMaxSignedValue - 1;
+
+ struct signedToUnsigned : public std::unary_function<SignedType, UnsignedType>
+ {
diff --git a/gnu/packages/patches/audiofile-hurd.patch b/gnu/packages/patches/audiofile-hurd.patch
new file mode 100644
index 0000000000..b5941dcf44
--- /dev/null
+++ b/gnu/packages/patches/audiofile-hurd.patch
@@ -0,0 +1,381 @@
+Description: Remove usage of PATH_MAX in tests to fix FTBFS on Hurd.
+ jcowgill: Removed Changelog changes
+Author: Pino Toscano <toscano.pino@tiscali.it>
+Origin: backport, https://github.com/mpruett/audiofile/commit/34c261034f1193a783196618f0052112e00fbcfe
+Bug: https://github.com/mpruett/audiofile/pull/17
+Bug-Debian: https://bugs.debian.org/762595
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+
+--- a/test/TestUtilities.cpp
++++ b/test/TestUtilities.cpp
+@@ -21,8 +21,8 @@
+ #include "TestUtilities.h"
+
+ #include <limits.h>
+-#include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <unistd.h>
+
+ bool createTemporaryFile(const std::string &prefix, std::string *path)
+@@ -35,12 +35,12 @@ bool createTemporaryFile(const std::stri
+ return true;
+ }
+
+-bool createTemporaryFile(const char *prefix, char *path)
++bool createTemporaryFile(const char *prefix, char **path)
+ {
+- snprintf(path, PATH_MAX, "/tmp/%s-XXXXXX", prefix);
+- int fd = ::mkstemp(path);
+- if (fd < 0)
+- return false;
+- ::close(fd);
+- return true;
++ *path = NULL;
++ std::string pathString;
++ bool result = createTemporaryFile(prefix, &pathString);
++ if (result)
++ *path = ::strdup(pathString.c_str());
++ return result;
+ }
+--- a/test/TestUtilities.h
++++ b/test/TestUtilities.h
+@@ -53,7 +53,7 @@ extern "C" {
+
+ #include <stdbool.h>
+
+-bool createTemporaryFile(const char *prefix, char *path);
++bool createTemporaryFile(const char *prefix, char **path);
+
+ #ifdef __cplusplus
+ }
+--- a/test/floatto24.c
++++ b/test/floatto24.c
+@@ -86,8 +86,8 @@ int main (int argc, char **argv)
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_FLOAT, 32);
+
+- char testFileName[PATH_MAX];
+- if (!createTemporaryFile("floatto24", testFileName))
++ char *testFileName;
++ if (!createTemporaryFile("floatto24", &testFileName))
+ {
+ fprintf(stderr, "Could not create temporary file.\n");
+ exit(EXIT_FAILURE);
+@@ -182,6 +182,7 @@ int main (int argc, char **argv)
+ }
+
+ unlink(testFileName);
++ free(testFileName);
+
+ exit(EXIT_SUCCESS);
+ }
+--- a/test/sixteen-to-eight.c
++++ b/test/sixteen-to-eight.c
+@@ -57,8 +57,8 @@ int main (int argc, char **argv)
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_UNSIGNED, 8);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+
+- char testFileName[PATH_MAX];
+- if (!createTemporaryFile("sixteen-to-eight", testFileName))
++ char *testFileName;
++ if (!createTemporaryFile("sixteen-to-eight", &testFileName))
+ {
+ fprintf(stderr, "Could not create temporary file.\n");
+ exit(EXIT_FAILURE);
+@@ -113,6 +113,7 @@ int main (int argc, char **argv)
+
+ afCloseFile(file);
+ unlink(testFileName);
++ free(testFileName);
+
+ exit(EXIT_SUCCESS);
+ }
+--- a/test/testchannelmatrix.c
++++ b/test/testchannelmatrix.c
+@@ -39,7 +39,7 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ const short samples[] = {300, -300, 515, -515, 2315, -2315, 9154, -9154};
+ #define SAMPLE_COUNT (sizeof (samples) / sizeof (short))
+@@ -47,7 +47,11 @@ const short samples[] = {300, -300, 515,
+
+ void cleanup (void)
+ {
+- unlink(sTestFileName);
++ if (sTestFileName)
++ {
++ unlink(sTestFileName);
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -76,7 +80,7 @@ int main (void)
+ afInitFileFormat(setup, AF_FILE_AIFFC);
+
+ /* Write stereo data to test file. */
+- ensure(createTemporaryFile("testchannelmatrix", sTestFileName),
++ ensure(createTemporaryFile("testchannelmatrix", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ ensure(file != AF_NULL_FILEHANDLE, "could not open file for writing");
+--- a/test/testdouble.c
++++ b/test/testdouble.c
+@@ -38,7 +38,7 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ const double samples[] =
+ {1.0, 0.6, -0.3, 0.95, 0.2, -0.6, 0.9, 0.4, -0.22, 0.125, 0.1, -0.4};
+@@ -48,7 +48,11 @@ void testdouble (int fileFormat);
+
+ void cleanup (void)
+ {
+- unlink(sTestFileName);
++ if (sTestFileName)
++ {
++ unlink(sTestFileName);
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -96,7 +100,7 @@ void testdouble (int fileFormat)
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_DOUBLE, 64);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 2);
+
+- ensure(createTemporaryFile("testdouble", sTestFileName),
++ ensure(createTemporaryFile("testdouble", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ ensure(file != AF_NULL_FILEHANDLE, "could not open file for writing");
+--- a/test/testfloat.c
++++ b/test/testfloat.c
+@@ -38,7 +38,7 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ const float samples[] =
+ {1.0, 0.6, -0.3, 0.95, 0.2, -0.6, 0.9, 0.4, -0.22, 0.125, 0.1, -0.4};
+@@ -48,7 +48,11 @@ void testfloat (int fileFormat);
+
+ void cleanup (void)
+ {
+- unlink(sTestFileName);
++ if (sTestFileName)
++ {
++ unlink(sTestFileName);
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -96,7 +100,7 @@ void testfloat (int fileFormat)
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_FLOAT, 32);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 2);
+
+- ensure(createTemporaryFile("testfloat", sTestFileName),
++ ensure(createTemporaryFile("testfloat", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ ensure(file != AF_NULL_FILEHANDLE, "could not open file for writing");
+--- a/test/testmarkers.c
++++ b/test/testmarkers.c
+@@ -32,15 +32,19 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ #define FRAME_COUNT 200
+
+ void cleanup (void)
+ {
++ if (sTestFileName)
++ {
+ #ifndef DEBUG
+- unlink(sTestFileName);
++ unlink(sTestFileName);
+ #endif
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -127,7 +131,7 @@ int testmarkers (int fileformat)
+
+ int main (void)
+ {
+- ensure(createTemporaryFile("testmarkers", sTestFileName),
++ ensure(createTemporaryFile("testmarkers", &sTestFileName),
+ "could not create temporary file");
+
+ testmarkers(AF_FILE_AIFF);
+--- a/test/twentyfour.c
++++ b/test/twentyfour.c
+@@ -71,8 +71,8 @@ int main (int argc, char **argv)
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 24);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+
+- char testFileName[PATH_MAX];
+- if (!createTemporaryFile("twentyfour", testFileName))
++ char *testFileName;
++ if (!createTemporaryFile("twentyfour", &testFileName))
+ {
+ fprintf(stderr, "could not create temporary file\n");
+ exit(EXIT_FAILURE);
+@@ -239,6 +239,7 @@ int main (int argc, char **argv)
+ exit(EXIT_FAILURE);
+ }
+ unlink(testFileName);
++ free(testFileName);
+
+ exit(EXIT_SUCCESS);
+ }
+--- a/test/twentyfour2.c
++++ b/test/twentyfour2.c
+@@ -45,15 +45,19 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ #define FRAME_COUNT 10000
+
+ void cleanup (void)
+ {
++ if (sTestFileName)
++ {
+ #ifndef DEBUG
+- unlink(sTestFileName);
++ unlink(sTestFileName);
+ #endif
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -78,7 +82,7 @@ int main (void)
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 24);
+
+- ensure(createTemporaryFile("twentyfour2", sTestFileName),
++ ensure(createTemporaryFile("twentyfour2", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ ensure(file != NULL, "could not open test file for writing");
+--- a/test/writealaw.c
++++ b/test/writealaw.c
+@@ -53,7 +53,7 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ #define FRAME_COUNT 16
+ #define SAMPLE_COUNT FRAME_COUNT
+@@ -62,9 +62,13 @@ void testalaw (int fileFormat);
+
+ void cleanup (void)
+ {
++ if (sTestFileName)
++ {
+ #ifndef DEBUG
+- unlink(sTestFileName);
++ unlink(sTestFileName);
+ #endif
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -113,7 +117,7 @@ void testalaw (int fileFormat)
+ afInitFileFormat(setup, fileFormat);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+
+- ensure(createTemporaryFile("writealaw", sTestFileName),
++ ensure(createTemporaryFile("writealaw", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ afFreeFileSetup(setup);
+--- a/test/writeraw.c
++++ b/test/writeraw.c
+@@ -44,13 +44,17 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ void cleanup (void)
+ {
++ if (sTestFileName)
++ {
+ #ifndef DEBUG
+- unlink(sTestFileName);
++ unlink(sTestFileName);
+ #endif
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -84,7 +88,7 @@ int main (int argc, char **argv)
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+ afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16);
+
+- ensure(createTemporaryFile("writeraw", sTestFileName),
++ ensure(createTemporaryFile("writeraw", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ ensure(file != AF_NULL_FILEHANDLE, "unable to open file for writing");
+--- a/test/writeulaw.c
++++ b/test/writeulaw.c
+@@ -53,7 +53,7 @@
+
+ #include "TestUtilities.h"
+
+-static char sTestFileName[PATH_MAX];
++static char *sTestFileName;
+
+ #define FRAME_COUNT 16
+ #define SAMPLE_COUNT FRAME_COUNT
+@@ -62,9 +62,13 @@ void testulaw (int fileFormat);
+
+ void cleanup (void)
+ {
++ if (sTestFileName)
++ {
+ #ifndef DEBUG
+- unlink(sTestFileName);
++ unlink(sTestFileName);
+ #endif
++ free(sTestFileName);
++ }
+ }
+
+ void ensure (int condition, const char *message)
+@@ -113,7 +117,7 @@ void testulaw (int fileFormat)
+ afInitFileFormat(setup, fileFormat);
+ afInitChannels(setup, AF_DEFAULT_TRACK, 1);
+
+- ensure(createTemporaryFile("writeulaw", sTestFileName),
++ ensure(createTemporaryFile("writeulaw", &sTestFileName),
+ "could not create temporary file");
+ file = afOpenFile(sTestFileName, "w", setup);
+ afFreeFileSetup(setup);
diff --git a/gnu/packages/patches/audiofile-signature-of-multiplyCheckOverflow.patch b/gnu/packages/patches/audiofile-signature-of-multiplyCheckOverflow.patch
new file mode 100644
index 0000000000..35627d3869
--- /dev/null
+++ b/gnu/packages/patches/audiofile-signature-of-multiplyCheckOverflow.patch
@@ -0,0 +1,35 @@
+From: Antonio Larrosa <larrosa@kde.org>
+Date: Fri, 10 Mar 2017 15:40:02 +0100
+Subject: Fix signature of multiplyCheckOverflow. It returns a bool, not an int
+
+---
+ libaudiofile/modules/MSADPCM.cpp | 2 +-
+ sfcommands/sfconvert.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libaudiofile/modules/MSADPCM.cpp b/libaudiofile/modules/MSADPCM.cpp
+index ef9c38c..d8c9553 100644
+--- a/libaudiofile/modules/MSADPCM.cpp
++++ b/libaudiofile/modules/MSADPCM.cpp
+@@ -116,7 +116,7 @@ int firstBitSet(int x)
+ #define __has_builtin(x) 0
+ #endif
+
+-int multiplyCheckOverflow(int a, int b, int *result)
++bool multiplyCheckOverflow(int a, int b, int *result)
+ {
+ #if (defined __GNUC__ && __GNUC__ >= 5) || ( __clang__ && __has_builtin(__builtin_mul_overflow))
+ return __builtin_mul_overflow(a, b, result);
+diff --git a/sfcommands/sfconvert.c b/sfcommands/sfconvert.c
+index 970a3e4..367f7a5 100644
+--- a/sfcommands/sfconvert.c
++++ b/sfcommands/sfconvert.c
+@@ -60,7 +60,7 @@ int firstBitSet(int x)
+ #define __has_builtin(x) 0
+ #endif
+
+-int multiplyCheckOverflow(int a, int b, int *result)
++bool multiplyCheckOverflow(int a, int b, int *result)
+ {
+ #if (defined __GNUC__ && __GNUC__ >= 5) || ( __clang__ && __has_builtin(__builtin_mul_overflow))
+ return __builtin_mul_overflow(a, b, result);
diff --git a/gnu/packages/patches/emacs27-exec-path.patch b/gnu/packages/patches/emacs27-exec-path.patch
new file mode 100644
index 0000000000..418aa633a1
--- /dev/null
+++ b/gnu/packages/patches/emacs27-exec-path.patch
@@ -0,0 +1,18 @@
+Do not capture the build-time value of $PATH in the 'emacs' executable
+since this can noticeably increase the size of the closure of Emacs
+with things like GCC being referenced.
+
+(like emacs-exec-path.patch, but for Emacs 27)
+
+--- a/lisp/loadup.el
++++ b/lisp/loadup.el
+@@ -479,7 +479,8 @@ lost after dumping")))
+ ((equal dump-mode "dump") "emacs")
+ ((equal dump-mode "bootstrap") "emacs")
+ ((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
+- (t (error "unrecognized dump mode %s" dump-mode)))))
++ (t (error "unrecognized dump mode %s" dump-mode))))
++ (exec-path nil))
+ (message "Dumping under the name %s" output)
+ (condition-case ()
+ (delete-file output)
diff --git a/gnu/packages/patches/gcc-7-cross-environment-variables.patch b/gnu/packages/patches/gcc-7-cross-environment-variables.patch
new file mode 100644
index 0000000000..99ae36f103
--- /dev/null
+++ b/gnu/packages/patches/gcc-7-cross-environment-variables.patch
@@ -0,0 +1,67 @@
+Search path environment variables for cross-compilers. See the discussion
+at <http://gcc.gnu.org/ml/gcc/2013-02/msg00124.html>.
+
+Note: Touch 'C_INCLUDE_PATH' et al. rather than 'CPATH', as discussed
+at <http://bugs.gnu.org/22186>.
+
+diff --git a/gcc/gcc.c b/gcc/gcc.c
+index eced0d5..08dec2b 100644
+--- a/gcc/gcc.c
++++ b/gcc/gcc.c
+@@ -4317,7 +4317,7 @@ process_command (unsigned int decoded_options_count,
+ }
+
+ temp = env.get (LIBRARY_PATH_ENV);
+- if (temp && *cross_compile == '0')
++ if (temp)
+ {
+ const char *startp, *endp;
+ char *nstore = (char *) alloca (strlen (temp) + 3);
+diff --git a/gcc/incpath.c b/gcc/incpath.c
+index 98fe5ec..96aff65 100644
+--- a/gcc/incpath.c
++++ b/gcc/incpath.c
+@@ -461,8 +461,8 @@ register_include_chains (cpp_reader *pfile, const char *sysroot,
+ int stdinc, int cxx_stdinc, int verbose)
+ {
+ static const char *const lang_env_vars[] =
+- { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH",
+- "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" };
++ { "CROSS_C_INCLUDE_PATH", "CROSS_CPLUS_INCLUDE_PATH",
++ "CROSS_OBJC_INCLUDE_PATH", "CROSS_OBJCPLUS_INCLUDE_PATH" };
+ cpp_options *cpp_opts = cpp_get_options (pfile);
+ size_t idx = (cpp_opts->objc ? 2: 0);
+
+@@ -473,7 +473,7 @@ register_include_chains (cpp_reader *pfile, const char *sysroot,
+
+ /* CPATH and language-dependent environment variables may add to the
+ include chain. */
+- add_env_var_paths ("CPATH", BRACKET);
++ add_env_var_paths ("CROSS_CPATH", BRACKET);
+ add_env_var_paths (lang_env_vars[idx], SYSTEM);
+
+ target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc);
+diff --git a/gcc/system.h b/gcc/system.h
+index 0cbf60a..3242c68 100644
+--- a/gcc/system.h
++++ b/gcc/system.h
+@@ -1169,4 +1169,6 @@ helper_const_non_const_cast (const char *p)
+ /* Get definitions of HOST_WIDE_INT. */
+ #include "hwint.h"
+
++#define LIBRARY_PATH_ENV "CROSS_LIBRARY_PATH"
++
+ #endif /* ! GCC_SYSTEM_H */
+diff --git a/gcc/tlink.c b/gcc/tlink.c
+index a2a7db0..2d96872 100644
+--- a/gcc/tlink.c
++++ b/gcc/tlink.c
+@@ -456,7 +456,7 @@ recompile_files (void)
+ file *f;
+
+ putenv (xstrdup ("COMPILER_PATH="));
+- putenv (xstrdup ("LIBRARY_PATH="));
++ putenv (xstrdup (LIBRARY_PATH_ENV "="));
+
+ while ((f = file_pop ()) != NULL)
+ {
diff --git a/gnu/packages/patches/grantlee-merge-theme-dirs.patch b/gnu/packages/patches/grantlee-merge-theme-dirs.patch
new file mode 100644
index 0000000000..96a15a387b
--- /dev/null
+++ b/gnu/packages/patches/grantlee-merge-theme-dirs.patch
@@ -0,0 +1,163 @@
+Taken from nixpkgs, see
+grantleetheme: merge themes across multiple prefixes
+<https://github.com/NixOS/nixpkgs/commits/master/pkgs/applications/kde/grantleetheme/grantlee-merge-theme-dirs.patch>
+
+
+diff --git a/src/grantleetheme.cpp b/src/grantleetheme.cpp
+index 27d5bc8..8d43140 100644
+--- a/src/grantleetheme.cpp
++++ b/src/grantleetheme.cpp
+@@ -46,7 +46,7 @@ ThemePrivate::ThemePrivate(const ThemePrivate &other)
+ , description(other.description)
+ , name(other.name)
+ , dirName(other.dirName)
+- , absolutePath(other.absolutePath)
++ , absolutePaths(other.absolutePaths)
+ , author(other.author)
+ , email(other.email)
+ , loader(other.loader)
+@@ -64,12 +64,15 @@ void ThemePrivate::setupEngine()
+
+ void ThemePrivate::setupLoader()
+ {
+- // Get the parent dir with themes, we set the theme directory separately
+- QDir dir(absolutePath);
+- dir.cdUp();
++ QStringList templateDirs;
++ for (const QString& path : absolutePaths) {
++ QDir dir(path);
++ dir.cdUp();
++ templateDirs << dir.absolutePath();
++ }
+
+ loader = QSharedPointer<GrantleeTheme::QtResourceTemplateLoader>::create();
+- loader->setTemplateDirs({ dir.absolutePath() });
++ loader->setTemplateDirs(templateDirs);
+ loader->setTheme(dirName);
+
+ if (!sEngine) {
+@@ -121,7 +124,7 @@ Theme::Theme(const QString &themePath, const QString &dirName, const QString &de
+ KConfigGroup group(&config, QStringLiteral("Desktop Entry"));
+ if (group.isValid()) {
+ d->dirName = dirName;
+- d->absolutePath = themePath;
++ d->absolutePaths = QStringList(themePath);
+ d->name = group.readEntry("Name", QString());
+ d->description = group.readEntry("Description", QString());
+ d->themeFileName = group.readEntry("FileName", QString());
+@@ -140,7 +143,7 @@ Theme::~Theme()
+
+ bool Theme::operator==(const Theme &other) const
+ {
+- return isValid() && other.isValid() && d->absolutePath == other.absolutePath();
++ return isValid() && other.isValid() && d->absolutePaths == other.absolutePaths();
+ }
+
+ Theme &Theme::operator=(const Theme &other)
+@@ -184,7 +187,15 @@ QString Theme::dirName() const
+
+ QString Theme::absolutePath() const
+ {
+- return d->absolutePath;
++ if (! d->absolutePaths.isEmpty()) {
++ return d->absolutePaths.first();
++ };
++ return QString();
++}
++
++QStringList Theme::absolutePaths() const
++{
++ return d->absolutePaths;
+ }
+
+ QString Theme::author() const
+@@ -223,6 +231,13 @@ QString Theme::render(const QString &templateName, const QVariantHash &data, con
+ return result;
+ }
+
++void Theme::addThemeDir(const QString& path)
++{
++ QDir dir(path);
++ dir.cdUp();
++ d->absolutePaths << dir.absolutePath();
++}
++
+ void Theme::addPluginPath(const QString &path)
+ {
+ if (!ThemePrivate::sEngine) {
+diff --git a/src/grantleetheme.h b/src/grantleetheme.h
+index a25c27b..be38299 100644
+--- a/src/grantleetheme.h
++++ b/src/grantleetheme.h
+@@ -48,11 +48,14 @@ public:
+ Q_REQUIRED_RESULT QStringList displayExtraVariables() const;
+ Q_REQUIRED_RESULT QString dirName() const;
+ Q_REQUIRED_RESULT QString absolutePath() const;
++ Q_REQUIRED_RESULT QStringList absolutePaths() const;
+ Q_REQUIRED_RESULT QString author() const;
+ Q_REQUIRED_RESULT QString authorEmail() const;
+
+ Q_REQUIRED_RESULT QString render(const QString &templateName, const QVariantHash &data, const QByteArray &applicationDomain = QByteArray());
+
++ void addThemeDir(const QString&);
++
+ static void addPluginPath(const QString &path);
+
+ private:
+diff --git a/src/grantleetheme_p.h b/src/grantleetheme_p.h
+index eb73dcb..00510e9 100644
+--- a/src/grantleetheme_p.h
++++ b/src/grantleetheme_p.h
+@@ -43,7 +43,7 @@ public:
+ QString description;
+ QString name;
+ QString dirName;
+- QString absolutePath;
++ QStringList absolutePaths;
+ QString author;
+ QString email;
+
+diff --git a/src/grantleethememanager.cpp b/src/grantleethememanager.cpp
+index 606d717..dc99041 100644
+--- a/src/grantleethememanager.cpp
++++ b/src/grantleethememanager.cpp
+@@ -125,25 +125,18 @@ public:
+
+ for (const QString &directory : qAsConst(themesDirectories)) {
+ QDirIterator dirIt(directory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
+- QStringList alreadyLoadedThemeName;
+ while (dirIt.hasNext()) {
+ dirIt.next();
+ const QString dirName = dirIt.fileName();
+ GrantleeTheme::Theme theme = q->loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
+ if (theme.isValid()) {
+ QString themeName = theme.name();
+- if (alreadyLoadedThemeName.contains(themeName)) {
+- int i = 2;
+- const QString originalName(theme.name());
+- while (alreadyLoadedThemeName.contains(themeName)) {
+- themeName = originalName + QStringLiteral(" (%1)").arg(i);
+- ++i;
+- }
+- theme.d->name = themeName;
++ QMap<QString, GrantleeTheme::Theme>::iterator i = themes.find(dirName);
++ if (i != themes.end()) {
++ i.value().addThemeDir(dirIt.filePath());
++ } else {
++ themes.insert(dirName, theme);
+ }
+- alreadyLoadedThemeName << themeName;
+- themes.insert(dirName, theme);
+- //qDebug()<<" theme.name()"<<theme.name();
+ }
+ }
+ watch->addDir(directory);
+@@ -366,7 +359,7 @@ QString ThemeManager::pathFromThemes(const QString &themesRelativePath, const QS
+ GrantleeTheme::Theme theme = loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
+ if (theme.isValid()) {
+ if (dirName == themeName) {
+- return theme.absolutePath();
++ return theme.absolutePaths().first();
+ }
+ }
+ }
diff --git a/gnu/packages/patches/hexchat-crash-exit.patch b/gnu/packages/patches/hexchat-crash-exit.patch
deleted file mode 100644
index e67fef73e0..0000000000
--- a/gnu/packages/patches/hexchat-crash-exit.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From d9c637ae8a1137d3ca512d2c560589903a4bd79d Mon Sep 17 00:00:00 2001
-From: Adam Williamson <awilliam@redhat.com>
-Date: Tue, 30 Apr 2019 11:16:01 -0700
-Subject: [PATCH] Python plugin: Call EndInterpreter when deinit'ing the plugin
-
-This fixes https://github.com/hexchat/hexchat/issues/2237 , a
-commonly-encountered bug when using Hexchat 2.14 on Python 3.7.
-Thanks to @ncoghlan for the fix.
-
-Signed-off-by: Adam Williamson <awilliam@redhat.com>
----
- plugins/python/python.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/plugins/python/python.c b/plugins/python/python.c
-index 4403474d..475756ba 100644
---- a/plugins/python/python.c
-+++ b/plugins/python/python.c
-@@ -2806,6 +2806,9 @@ hexchat_plugin_deinit(void)
- xchatout_buffer = NULL;
-
- if (interp_plugin) {
-+ PyThreadState *tstate = ((PluginObject*)interp_plugin)->tstate;
-+ PyThreadState_Swap(tstate);
-+ Py_EndInterpreter(tstate);
- Py_DECREF(interp_plugin);
- interp_plugin = NULL;
- }
---
-2.21.0
-
diff --git a/gnu/packages/patches/jfsutils-add-sysmacros.patch b/gnu/packages/patches/jfsutils-add-sysmacros.patch
new file mode 100644
index 0000000000..2349e37c06
--- /dev/null
+++ b/gnu/packages/patches/jfsutils-add-sysmacros.patch
@@ -0,0 +1,26 @@
+From: Tobias Geerinckx-Rice <me@tobias.gr>
+Date: Thu, 12 Dec 2019 02:15:37 +0100
+Subject: gnu: jfsutils: Include sys/sysmacros.h.
+
+Copied verbatim[0] from the Debian package.
+
+[0]: https://sources.debian.org/patches/jfsutils/1.1.15-4/add_sysmacros.patch
+
+Description: Include sys/sysmacros.h
+ Mentioned header needed for major() definition.
+Author: Laszlo Boszormenyi (GCS) <gcs@debian.org>
+Last-Update: 2018-12-11
+
+---
+
+--- jfsutils-1.1.15.orig/libfs/devices.c
++++ jfsutils-1.1.15/libfs/devices.c
+@@ -49,6 +49,8 @@
+ #include <sys/disklabel.h>
+ #endif
+
++#include <sys/sysmacros.h>
++
+ #include "jfs_types.h"
+ #include "jfs_filsys.h"
+ #include "devices.h"
diff --git a/gnu/packages/patches/jfsutils-include-systypes.patch b/gnu/packages/patches/jfsutils-include-systypes.patch
new file mode 100644
index 0000000000..ef1515d02c
--- /dev/null
+++ b/gnu/packages/patches/jfsutils-include-systypes.patch
@@ -0,0 +1,25 @@
+From: Tobias Geerinckx-Rice <me@tobias.gr>
+Date: Thu, 12 Dec 2019 02:15:37 +0100
+Subject: gnu: jfsutils: Include sys/types.h.
+
+Copied verbatim[0] from the Debian package.
+
+[0]: https://sources.debian.org/patches/jfsutils/1.1.15-4/missing-includes.diff
+
+Description: Add missing include to fix FTBFS with eglibc 2.17
+Origin: vendor, http://patches.ubuntu.com/j/jfsutils/jfsutils_1.1.15-2ubuntu1.patch
+Bug-Debian: http://bugs.debian.org/701433
+Last-Update: 2013-07-05
+
+Index: b/fscklog/extract.c
+===================================================================
+--- a/fscklog/extract.c 2006-06-05 19:31:40.000000000 +0000
++++ b/fscklog/extract.c 2013-04-02 07:13:08.737654963 +0000
+@@ -28,6 +28,7 @@
+ #include <stdio.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <sys/types.h>
+
+ #include "devices.h"
+ #include "diskmap.h"
diff --git a/gnu/packages/patches/kmplayer-aarch64.patch b/gnu/packages/patches/kmplayer-aarch64.patch
new file mode 100644
index 0000000000..76f713be96
--- /dev/null
+++ b/gnu/packages/patches/kmplayer-aarch64.patch
@@ -0,0 +1,57 @@
+Index: b/src/moz-sdk/prcpucfg.h
+===================================================================
+--- a/src/moz-sdk/prcpucfg.h
++++ b/src/moz-sdk/prcpucfg.h
+@@ -288,6 +288,52 @@
+ #define PR_BYTES_PER_WORD_LOG2 3
+ #define PR_BYTES_PER_DWORD_LOG2 3
+
++#elif defined(__aarch64__)
++
++#define IS_LITTLE_ENDIAN 1
++#undef IS_BIG_ENDIAN
++#define IS_64
++
++#define PR_BYTES_PER_BYTE 1
++#define PR_BYTES_PER_SHORT 2
++#define PR_BYTES_PER_INT 4
++#define PR_BYTES_PER_INT64 8
++#define PR_BYTES_PER_LONG 8
++#define PR_BYTES_PER_FLOAT 4
++#define PR_BYTES_PER_DOUBLE 8
++#define PR_BYTES_PER_WORD 8
++#define PR_BYTES_PER_DWORD 8
++
++#define PR_BITS_PER_BYTE 8
++#define PR_BITS_PER_SHORT 16
++#define PR_BITS_PER_INT 32
++#define PR_BITS_PER_INT64 64
++#define PR_BITS_PER_LONG 64
++#define PR_BITS_PER_FLOAT 32
++#define PR_BITS_PER_DOUBLE 64
++#define PR_BITS_PER_WORD 64
++
++#define PR_BITS_PER_BYTE_LOG2 3
++#define PR_BITS_PER_SHORT_LOG2 4
++#define PR_BITS_PER_INT_LOG2 5
++#define PR_BITS_PER_INT64_LOG2 6
++#define PR_BITS_PER_LONG_LOG2 6
++#define PR_BITS_PER_FLOAT_LOG2 5
++#define PR_BITS_PER_DOUBLE_LOG2 6
++#define PR_BITS_PER_WORD_LOG2 6
++
++#define PR_ALIGN_OF_SHORT 2
++#define PR_ALIGN_OF_INT 4
++#define PR_ALIGN_OF_LONG 8
++#define PR_ALIGN_OF_INT64 8
++#define PR_ALIGN_OF_FLOAT 4
++#define PR_ALIGN_OF_DOUBLE 8
++#define PR_ALIGN_OF_POINTER 8
++#define PR_ALIGN_OF_WORD 8
++
++#define PR_BYTES_PER_WORD_LOG2 3
++#define PR_BYTES_PER_DWORD_LOG2 3
++
+ #elif defined(__mc68000__)
+
+ #undef IS_LITTLE_ENDIAN
diff --git a/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch b/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch
new file mode 100644
index 0000000000..6a40dbe347
--- /dev/null
+++ b/gnu/packages/patches/kmplayer-upstream_Fix-build-with-Qt-5.9.patch
@@ -0,0 +1,42 @@
+From 3def65075c09af4961cd399e8e78ed78cca72e65 Mon Sep 17 00:00:00 2001
+From: Wolfgang Bauer <wbauer@tmo.at>
+Date: Wed, 11 Oct 2017 22:16:02 +0200
+Subject: [PATCH] Fix build with Qt 5.9
+
+Summary:
+moc 5.9 errors out when building:
+Error: Plugin Metadata file "" could not be opened: file to open is a directory
+
+Same issue and fix as https://phabricator.kde.org/D5392 for khtml.
+
+CCBUG: 377490
+
+Test Plan: builds fine now with Qt 5.9.0rc and also earlier versions.
+
+Reviewers: vriezen, pino
+
+Reviewed By: pino
+
+Subscribers: pino
+
+Differential Revision: https://phabricator.kde.org/D5985
+---
+ src/kmplayer_part.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/kmplayer_part.h b/src/kmplayer_part.h
+index f90f85d..0fddbaa 100644
+--- a/src/kmplayer_part.h
++++ b/src/kmplayer_part.h
+@@ -36,7 +36,7 @@ namespace KMPlayer {
+
+ class KMPlayerFactory : public KPluginFactory {
+ Q_OBJECT
+- Q_PLUGIN_METADATA(IID "org.kde.KPluginFactory" FILE "")
++ Q_PLUGIN_METADATA(IID "org.kde.KPluginFactory")
+ Q_INTERFACES(KPluginFactory)
+ public:
+ KMPlayerFactory();
+--
+2.14.2
+
diff --git a/gnu/packages/patches/libgeotiff-adapt-test-script-for-proj-6.2.patch b/gnu/packages/patches/libgeotiff-adapt-test-script-for-proj-6.2.patch
new file mode 100644
index 0000000000..746610c095
--- /dev/null
+++ b/gnu/packages/patches/libgeotiff-adapt-test-script-for-proj-6.2.patch
@@ -0,0 +1,63 @@
+From 678ffd97db2d63cf6856428bea65a93e069f812f Mon Sep 17 00:00:00 2001
+From: Even Rouault <even.rouault@spatialys.com>
+Date: Wed, 4 Sep 2019 16:11:37 +0200
+Subject: [PATCH 1/2] Adapt test script for PROJ 6.2 EPSG database (fixes #22)
+
+---
+ libgeotiff/test/testlistgeo | 8 +++++++-
+ libgeotiff/test/testlistgeo_out.dist | 4 ++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/libgeotiff/test/testlistgeo b/libgeotiff/test/testlistgeo
+index 7fb4a2f..571f5d0 100755
+--- a/test/testlistgeo
++++ b/test/testlistgeo
+@@ -210,10 +210,15 @@ echo "Testing listgeo equidistant_cylindrical.tif" >> ${OUT}
+ $EXE ${DATA_DIR}/equidistant_cylindrical.tif >>${OUT}
+ echo "" >>${OUT}
+
++# Normalize for results depending on the exact version of PROJ / EPSG database
++sed "s/ETRS89-extended/ETRS89/g" < ${OUT} > ${OUT}.tmp
++mv ${OUT}.tmp ${OUT}
++
++sed "s/ETRS89-extended/ETRS89/g" < ${TEST_CLI_DIR}/testlistgeo_out.dist > testlistgeo_out.dist.tmp
+
+ # do 'diff' with distribution results
+ echo "diff ${OUT} with testlistgeo_out.dist"
+-diff -u ${OUT} ${TEST_CLI_DIR}/testlistgeo_out.dist
++diff -u ${OUT} testlistgeo_out.dist.tmp
+ if [ $? -ne 0 ] ; then
+ echo ""
+ echo "PROBLEMS HAVE OCCURRED"
+@@ -224,6 +229,7 @@ else
+ echo "TEST OK"
+ echo "test file ${OUT} removed"
+ echo
++ rm testlistgeo_out.dist.tmp
+ /bin/rm -f ${OUT}
+ exit 0
+ fi
+diff --git a/libgeotiff/test/testlistgeo_out.dist b/libgeotiff/test/testlistgeo_out.dist
+index 68a948c..c157f00 100644
+--- a/test/testlistgeo_out.dist
++++ b/test/testlistgeo_out.dist
+@@ -1738,11 +1738,11 @@ Geotiff_Information:
+ Keyed_Information:
+ GTModelTypeGeoKey (Short,1): ModelTypeProjected
+ GTRasterTypeGeoKey (Short,1): RasterPixelIsArea
+- ProjectedCSTypeGeoKey (Short,1): Code-3035 (ETRS89 / LAEA Europe)
++ ProjectedCSTypeGeoKey (Short,1): Code-3035 (ETRS89-extended / LAEA Europe)
+ End_Of_Keys.
+ End_Of_Geotiff.
+
+-PCS = 3035 (ETRS89 / LAEA Europe)
++PCS = 3035 (ETRS89-extended / LAEA Europe)
+ Projection = 19986 (Europe Equal Area 2001)
+ Projection Method: CT_LambertAzimEqualArea
+ ProjCenterLatGeoKey: 52.000000 ( 52d 0' 0.00"N)
+
+From 15af10648c4cb7b4c55cbe08caaf9884c1d156d9 Mon Sep 17 00:00:00 2001
+From: Even Rouault <even.rouault@spatialys.com>
+Date: Wed, 4 Sep 2019 19:13:11 +0200
+Subject: [PATCH 2/2] appveyor.yml: build vcpkg from source to fix issue with
+ VS2015
diff --git a/gnu/packages/patches/linux-libre-active-entropy.patch b/gnu/packages/patches/linux-libre-active-entropy.patch
deleted file mode 100644
index 8f081f4a19..0000000000
--- a/gnu/packages/patches/linux-libre-active-entropy.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-Try to actively add entropy instead of waiting forever.
-Fixes <https://bugs.gnu.org/37501>.
-
-Taken from upstream:
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=50ee7529ec4500c88f8664560770a7a1b65db72b
-
-diff --git a/drivers/char/random.c b/drivers/char/random.c
-index 5d5ea4ce1442..2fda6166c1dd 100644
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -1731,6 +1731,56 @@ void get_random_bytes(void *buf, int nbytes)
- }
- EXPORT_SYMBOL(get_random_bytes);
-
-+
-+/*
-+ * Each time the timer fires, we expect that we got an unpredictable
-+ * jump in the cycle counter. Even if the timer is running on another
-+ * CPU, the timer activity will be touching the stack of the CPU that is
-+ * generating entropy..
-+ *
-+ * Note that we don't re-arm the timer in the timer itself - we are
-+ * happy to be scheduled away, since that just makes the load more
-+ * complex, but we do not want the timer to keep ticking unless the
-+ * entropy loop is running.
-+ *
-+ * So the re-arming always happens in the entropy loop itself.
-+ */
-+static void entropy_timer(struct timer_list *t)
-+{
-+ credit_entropy_bits(&input_pool, 1);
-+}
-+
-+/*
-+ * If we have an actual cycle counter, see if we can
-+ * generate enough entropy with timing noise
-+ */
-+static void try_to_generate_entropy(void)
-+{
-+ struct {
-+ unsigned long now;
-+ struct timer_list timer;
-+ } stack;
-+
-+ stack.now = random_get_entropy();
-+
-+ /* Slow counter - or none. Don't even bother */
-+ if (stack.now == random_get_entropy())
-+ return;
-+
-+ timer_setup_on_stack(&stack.timer, entropy_timer, 0);
-+ while (!crng_ready()) {
-+ if (!timer_pending(&stack.timer))
-+ mod_timer(&stack.timer, jiffies+1);
-+ mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now));
-+ schedule();
-+ stack.now = random_get_entropy();
-+ }
-+
-+ del_timer_sync(&stack.timer);
-+ destroy_timer_on_stack(&stack.timer);
-+ mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now));
-+}
-+
- /*
- * Wait for the urandom pool to be seeded and thus guaranteed to supply
- * cryptographically secure random numbers. This applies to: the /dev/urandom
-@@ -1745,7 +1795,17 @@ int wait_for_random_bytes(void)
- {
- if (likely(crng_ready()))
- return 0;
-- return wait_event_interruptible(crng_init_wait, crng_ready());
-+
-+ do {
-+ int ret;
-+ ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ);
-+ if (ret)
-+ return ret > 0 ? 0 : ret;
-+
-+ try_to_generate_entropy();
-+ } while (!crng_ready());
-+
-+ return 0;
- }
- EXPORT_SYMBOL(wait_for_random_bytes);
-
diff --git a/gnu/packages/patches/mumble-1.2.19-abs.patch b/gnu/packages/patches/mumble-1.2.19-abs.patch
deleted file mode 100644
index 683325f4bc..0000000000
--- a/gnu/packages/patches/mumble-1.2.19-abs.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From ea861fe86743c8402bbad77d8d1dd9de8dce447e Mon Sep 17 00:00:00 2001
-From: Mikkel Krautz <mikkel@krautz.dk>
-Date: Fri, 29 Dec 2017 14:47:25 +0100
-Subject: [PATCH] AudioOutput: do not use non-existant template version of
- std::abs.
-
-This change fixes AudioOutput to use the float overload of std::abs:
-
- float std::abs(float);
-
-instead of a non-existant template version (for newer Boost 1.66).
-
-Fixes mumble-voip/mumble#3281
-
----
- src/mumble/AudioOutput.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/mumble/AudioOutput.cpp b/src/mumble/AudioOutput.cpp
-index cbe0c0e2b..7a0a5e2ab 100644
---- a/src/mumble/AudioOutput.cpp
-+++ b/src/mumble/AudioOutput.cpp
-@@ -437,7 +437,7 @@ bool AudioOutput::mix(void *outbuff, unsigned int nsamp) {
- top[2] = 0.0f;
- }
-
-- if (std::abs<float>(front[0] * top[0] + front[1] * top[1] + front[2] * top[2]) > 0.01f) {
-+ if (std::abs(front[0] * top[0] + front[1] * top[1] + front[2] * top[2]) > 0.01f) {
- // Not perpendicular. Assume Y up and rotate 90 degrees.
-
- float azimuth = 0.0f;