summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2017-05-31 21:26:00 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2017-06-01 10:15:07 +0200
commitdfa7d220828b373c8d45ea627ea5b37dee28fcb7 (patch)
treeead37b34c834de44b36436c4cbfccf092235e7a5
parent29edf549a07f9ef4d55cee0e9caf890df35d18b3 (diff)
main/v4l-utils: fix segfault due to undefined behavior in getsubopt
fixes #7047
-rw-r--r--main/v4l-utils/APKBUILD9
-rw-r--r--main/v4l-utils/getsubopt.patch36
2 files changed, 42 insertions, 3 deletions
diff --git a/main/v4l-utils/APKBUILD b/main/v4l-utils/APKBUILD
index 76a948c5f9b..bac61121a6a 100644
--- a/main/v4l-utils/APKBUILD
+++ b/main/v4l-utils/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Francesco Colista <fcolista@alpinelinux.org>
pkgname=v4l-utils
pkgver=1.12.5
-pkgrel=0
+pkgrel=1
pkgdesc="Userspace tools and conversion library for Video 4 Linux"
url="http://freshmeat.net/projects/libv4l"
arch="all"
@@ -12,7 +12,9 @@ subpackages="$pkgname-dev $pkgname-doc qv4l2 $pkgname-dvbv5 $pkgname-libs ir_key
source="http://linuxtv.org/downloads/v4l-utils/$pkgname-$pkgver.tar.bz2
qv4l2.svg
qv4l2.desktop
- 0001-ir-ctl-fixes-for-musl-compile.patch"
+ 0001-ir-ctl-fixes-for-musl-compile.patch
+ getsubopt.patch
+ "
builddir="$srcdir"/$pkgname-$pkgver
check() {
@@ -89,4 +91,5 @@ ir_keytable() {
sha512sums="ed2e7545a728360b9684db68330885b498a3a5611f49b80e54da72109d9ba2aa75e85f89f085ff0a6f077b17c880101fa5b78c9dff8a0df2eac1866bd80a04ea v4l-utils-1.12.5.tar.bz2
bc18280046c15b19984103f7c2bb44a0aea79715803c64f0c64bc932499c09022c956914c3b15ae59499adc09f6fbff5378be45707fe851250f495a26b63d682 qv4l2.svg
6f74aa524b3de420eeb8de788ff3f717020732a3f1f6530caee50e63aae7eddbe5f551ffc50065c9f5d6078c13bace089948ecdcacf01f8b82c1a44960e06315 qv4l2.desktop
-f93d18b282d52c6cccbedc489e201a19b59f44b5e0aeb74b96537c3f5797c0b3c3f1499cd6ae822715c712e92b5ec5749749394f004ae1887a8bae3bac117c5b 0001-ir-ctl-fixes-for-musl-compile.patch"
+f93d18b282d52c6cccbedc489e201a19b59f44b5e0aeb74b96537c3f5797c0b3c3f1499cd6ae822715c712e92b5ec5749749394f004ae1887a8bae3bac117c5b 0001-ir-ctl-fixes-for-musl-compile.patch
+9a4f6d0a44d30bb7afe4db8b40074d362f240cae1f1b13feb0eb2b1b666479fc6f73ef27542f6f80fb1b922c9540feadc9ff8563890ff3041d3f7fc62e504e29 getsubopt.patch"
diff --git a/main/v4l-utils/getsubopt.patch b/main/v4l-utils/getsubopt.patch
new file mode 100644
index 00000000000..c476e5ed7e7
--- /dev/null
+++ b/main/v4l-utils/getsubopt.patch
@@ -0,0 +1,36 @@
+POSIX says that behavior when subopts list is empty is undefined.
+musl libs will set value to NULL which leads to crash.
+
+Simply avoid getsubopt, since we cannot rely on it.
+
+diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp
+index 3ea6cd3..291fb3e 100644
+--- a/utils/v4l2-ctl/v4l2-ctl-common.cpp
++++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp
+@@ -692,16 +692,17 @@ static bool parse_subset(char *optarg)
+
+ static bool parse_next_subopt(char **subs, char **value)
+ {
+- static char *const subopts[] = {
+- NULL
+- };
+- int opt = getsubopt(subs, subopts, value);
++ char *p = *subs;
++ *value = *subs;
+
+- if (opt < 0 || *value)
+- return false;
+- fprintf(stderr, "No value given to suboption <%s>\n",
+- subopts[opt]);
+- return true;
++ while (*p && *p != ',')
++ p++;
++
++ if (*p)
++ *p++ = '\0';
++
++ *subs = p;
++ return false;
+ }
+
+ void common_cmd(int ch, char *optarg)