summary refs log tree commit diff
path: root/gnu/packages/patches
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2018-05-08 18:45:39 -0400
committerMark H Weaver <mhw@netris.org>2018-05-08 18:45:39 -0400
commitaedc6e9fc952665e666f2febfc0b37235ad850ff (patch)
tree00d236f54b01e534b97b674673ca1ccd9b3cd18d /gnu/packages/patches
parent69d5909e032e2fba57814ea9db52389d384d9341 (diff)
parentf1f6f227264999bb362a95e6ec74badcb7de34db (diff)
downloadguix-aedc6e9fc952665e666f2febfc0b37235ad850ff.tar.gz
Merge branch 'master' into core-updates
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r--gnu/packages/patches/strace-kernel-4.16.patch92
-rw-r--r--gnu/packages/patches/wesnoth-fix-std-bad-cast.patch67
2 files changed, 159 insertions, 0 deletions
diff --git a/gnu/packages/patches/strace-kernel-4.16.patch b/gnu/packages/patches/strace-kernel-4.16.patch
new file mode 100644
index 0000000000..e86d3be439
--- /dev/null
+++ b/gnu/packages/patches/strace-kernel-4.16.patch
@@ -0,0 +1,92 @@
+Fix test failure when using Linux-Libre >= 4.16.
+
+Taken from upstream:
+https://github.com/strace/strace/commit/bcff87c31c0f27c678a43d6b7f67dab363a974fa
+
+From bcff87c31c0f27c678a43d6b7f67dab363a974fa Mon Sep 17 00:00:00 2001
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Wed, 2 May 2018 17:11:07 +0900
+Subject: [PATCH] tests/ioctl_kvm_run.c: handle cpuid at the end of vcpu dentry
+
+Since Linux 4.16, kernel appends the cpuid as suffix to the entry
+for a kvm vcpu in /proc/$pid/fd like:
+
+    anon_inode:kvm-vcpu:0
+
+That was
+
+    anon_inode:kvm-vcpu
+
+This kernel change causes the test case failure on newer kernels.
+Update the test to deal with the new name as well as the old one.
+
+* tests/ioctl_kvm_run.c: Include unistd.h for using readlink(2).
+(vcpu_dev_should_have_cpuid): New function for detecting whether
+a proc entry for given fd has the cpuid suffix or not.
+(main): Trim vcpu_dev to remove the cpuid suffix if needed.
+(vcpu_dev): Remove const modifier.
+---
+ tests/ioctl_kvm_run.c | 29 ++++++++++++++++++++++++++++-
+ 1 file changed, 28 insertions(+), 1 deletion(-)
+
+diff --git a/tests/ioctl_kvm_run.c b/tests/ioctl_kvm_run.c
+index 179461430..e1bef5796 100644
+--- a/tests/ioctl_kvm_run.c
++++ b/tests/ioctl_kvm_run.c
+@@ -40,6 +40,7 @@
+ # include <string.h>
+ # include <sys/ioctl.h>
+ # include <sys/mman.h>
++# include <unistd.h>
+ # include <linux/kvm.h>
+ 
+ static int
+@@ -56,7 +57,7 @@ kvm_ioctl(int fd, unsigned long cmd, const char *cmd_str, void *arg)
+ 
+ static const char dev[] = "/dev/kvm";
+ static const char vm_dev[] = "anon_inode:kvm-vm";
+-static const char vcpu_dev[] = "anon_inode:kvm-vcpu";
++static char vcpu_dev[] = "anon_inode:kvm-vcpu:0";
+ static size_t page_size;
+ 
+ extern const char code[];
+@@ -165,6 +166,23 @@ run_kvm(const int vcpu_fd, struct kvm_run *const run, const size_t mmap_size,
+ 	}
+ }
+ 
++static int
++vcpu_dev_should_have_cpuid(int fd)
++{
++	int r = 0;
++	char *filename = NULL;
++	char buf[sizeof(vcpu_dev)];
++
++	if (asprintf(&filename, "/proc/%d/fd/%d", getpid(), fd) < 0)
++		error_msg_and_fail("asprintf");
++
++	if (readlink(filename, buf, sizeof(buf)) == sizeof(buf) - 1
++	    && (memcmp(buf, vcpu_dev, sizeof(buf) - 1) == 0))
++		r = 1;
++	free(filename);
++	return r;
++}
++
+ int
+ main(void)
+ {
+@@ -208,6 +226,15 @@ main(void)
+ 	       (unsigned long) page_size, (unsigned long) page_size, mem);
+ 
+ 	int vcpu_fd = KVM_IOCTL(vm_fd, KVM_CREATE_VCPU, NULL);
++	if (!vcpu_dev_should_have_cpuid(vcpu_fd))
++		/*
++		 * This is an older kernel that doesn't place a cpuid
++		 * at the end of the dentry associated with vcpu_fd.
++		 * Trim the cpuid part of vcpu_dev like:
++		 * "anon_inode:kvm-vcpu:0" -> "anon_inode:kvm-vcpu"
++		 */
++		vcpu_dev[strlen (vcpu_dev) - 2] = '\0';
++
+ 	printf("ioctl(%d<%s>, KVM_CREATE_VCPU, 0) = %d<%s>\n",
+ 	       vm_fd, vm_dev, vcpu_fd, vcpu_dev);
+ 
diff --git a/gnu/packages/patches/wesnoth-fix-std-bad-cast.patch b/gnu/packages/patches/wesnoth-fix-std-bad-cast.patch
new file mode 100644
index 0000000000..18328ed018
--- /dev/null
+++ b/gnu/packages/patches/wesnoth-fix-std-bad-cast.patch
@@ -0,0 +1,67 @@
+From 18e5ea50a7136cb3686c5a7c51c111ccce73dc54 Mon Sep 17 00:00:00 2001
+From: Iris Morelle <shadowm@wesnoth.org>
+Date: Sun, 6 May 2018 16:10:42 -0300
+Subject: [PATCH] i18n: Blind fix attempt for std::bad_cast being thrown on
+ Windows
+
+Several reports on Steam and our forums point at std::bad_cast being
+thrown when accessing Preferences and the Multiplayer menu amongst
+others. It's possible that the locale configuration on those systems is
+not quite right, and compare() and icompare() are able to throw
+std::bad_cast when this happens as they both use std::use_facet().
+
+Note that much like the macOS/iOS version of icompare(), this stopgap
+patch doesn't attempt to provide any form of case-insensitive fallback
+and just uses a case-sensitive comparison instead.
+---
+ src/gettext_boost.cpp | 29 +++++++++++++++++++++++++++--
+ 1 file changed, 27 insertions(+), 2 deletions(-)
+
+diff --git a/src/gettext_boost.cpp b/src/gettext_boost.cpp
+index 3cc7690d5ef..fb04ffeea90 100644
+--- a/src/gettext_boost.cpp
++++ b/src/gettext_boost.cpp
+@@ -423,7 +423,19 @@ void set_language(const std::string& language, const std::vector<std::string>* /
+ int compare(const std::string& s1, const std::string& s2)
+ {
+ 	std::lock_guard<std::mutex> lock(get_mutex());
+-	return std::use_facet<std::collate<char>>(get_manager().get_locale()).compare(s1.c_str(), s1.c_str() + s1.size(), s2.c_str(), s2.c_str() + s2.size());
++
++	try {
++		return std::use_facet<std::collate<char>>(get_manager().get_locale()).compare(s1.c_str(), s1.c_str() + s1.size(), s2.c_str(), s2.c_str() + s2.size());
++	} catch(const std::bad_cast&) {
++		static bool bad_cast_once = false;
++
++		if(!bad_cast_once) {
++			ERR_G << "locale set-up for compare() is broken, falling back to std::string::compare()\n";
++			bad_cast_once = true;
++		}
++
++		return s1.compare(s2);
++	}
+ }
+ 
+ int icompare(const std::string& s1, const std::string& s2)
+@@ -433,8 +445,21 @@ int icompare(const std::string& s1, const std::string& s2)
+ 	return compare(s1, s2);
+ #else
+ 	std::lock_guard<std::mutex> lock(get_mutex());
+-	return std::use_facet<bl::collator<char>>(get_manager().get_locale()).compare(
++
++	try {
++		return std::use_facet<bl::collator<char>>(get_manager().get_locale()).compare(
+ 			bl::collator_base::secondary, s1, s2);
++	} catch(const std::bad_cast&) {
++		static bool bad_cast_once = false;
++
++		if(!bad_cast_once) {
++			ERR_G << "locale set-up for icompare() is broken, falling back to std::string::compare()\n";
++			bad_cast_once = true;
++		}
++
++		// FIXME: not even lazily case-insensitive
++		return s1.compare(s2);
++	}
+ #endif
+ }
+