summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Wellving <andreas.wellving@enea.com>2018-10-12 10:48:58 +0200
committerAdrian Dudau <Adrian.Dudau@enea.com>2018-10-16 17:37:22 +0200
commit9d7d5feacd408f22ec91afc9e88016a5ece31d32 (patch)
tree26e3c0ae6ce150094d267d1618bb58c15e503213
parentc9e50e25d48690db96a3ea529feb03ed2f786450 (diff)
downloadenea-kernel-cache-9d7d5feacd408f22ec91afc9e88016a5ece31d32.tar.gz
ARM: amba: CVE-2018-9415
ARM: amba: Fix race condition with driver_override References: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-4.9.y&id=272c99cf85a371401b78f3c56a18745bf07817a3 Change-Id: I9367a1d020bc4641f136a91d2ff29442221ee9e8 Signed-off-by: Andreas Wellving <andreas.wellving@enea.com>
-rw-r--r--patches/cve/4.9.x.scc1
-rw-r--r--patches/cve/CVE-2018-9415-ARM-amba-Fix-race-condition-with-driver_override.patch77
2 files changed, 78 insertions, 0 deletions
diff --git a/patches/cve/4.9.x.scc b/patches/cve/4.9.x.scc
index c97927f..9950d18 100644
--- a/patches/cve/4.9.x.scc
+++ b/patches/cve/4.9.x.scc
@@ -18,3 +18,4 @@ patch CVE-2018-1108-random-fix-crng_ready-test.patch
18 18
19#CVEs fixed in 4.9.98: 19#CVEs fixed in 4.9.98:
20patch CVE-2018-1093-ext4-add-validity-checks-for-bitmap-block-numbers.patch 20patch CVE-2018-1093-ext4-add-validity-checks-for-bitmap-block-numbers.patch
21patch CVE-2018-9415-ARM-amba-Fix-race-condition-with-driver_override.patch
diff --git a/patches/cve/CVE-2018-9415-ARM-amba-Fix-race-condition-with-driver_override.patch b/patches/cve/CVE-2018-9415-ARM-amba-Fix-race-condition-with-driver_override.patch
new file mode 100644
index 0000000..363fb7b
--- /dev/null
+++ b/patches/cve/CVE-2018-9415-ARM-amba-Fix-race-condition-with-driver_override.patch
@@ -0,0 +1,77 @@
1Date: Fri, 12 Oct 2018 10:25:59 +0200
2Subject: [PATCH] ARM: amba: Fix race condition with driver_override commit
3 6a7228d90d42bcacfe38786756ba62762b91c20a upstream.
4
5The driver_override implementation is susceptible to a race condition
6when different threads are reading vs storing a different driver
7override. Add locking to avoid this race condition.
8
9Cfr. commits 6265539776a0810b ("driver core: platform: fix race
10condition with driver_override") and 9561475db680f714 ("PCI: Fix race
11condition with driver_override").
12
13Fixes: 3cf385713460eb2b ("ARM: 8256/1: driver coamba: add device binding path 'driver_override'")
14
15CVE: CVE-2018-9415
16Upstream-Status: Backport
17
18Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
19Reviewed-by: Todd Kjos <tkjos@google.com>
20Cc: stable <stable@vger.kernel.org>
21Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
22Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
23Signed-off-by: Andreas Wellving <andreas.wellving@enea.com>
24---
25 drivers/amba/bus.c | 13 ++++++++++---
26 1 file changed, 10 insertions(+), 3 deletions(-)
27
28diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
29index a56fa2a..b112448 100644
30--- a/drivers/amba/bus.c
31+++ b/drivers/amba/bus.c
32@@ -69,11 +69,15 @@ static ssize_t driver_override_show(struct device *_dev,
33 struct device_attribute *attr, char *buf)
34 {
35 struct amba_device *dev = to_amba_device(_dev);
36-
37+ ssize_t len;
38+
39 if (!dev->driver_override)
40 return 0;
41
42- return sprintf(buf, "%s\n", dev->driver_override);
43+ device_lock(_dev);
44+ len = sprintf(buf, "%s\n", dev->driver_override);
45+ device_unlock(_dev);
46+ return len;
47 }
48
49 static ssize_t driver_override_store(struct device *_dev,
50@@ -81,7 +85,7 @@ static ssize_t driver_override_store(struct device *_dev,
51 const char *buf, size_t count)
52 {
53 struct amba_device *dev = to_amba_device(_dev);
54- char *driver_override, *old = dev->driver_override, *cp;
55+ char *driver_override, *old, *cp;
56
57 if (count > PATH_MAX)
58 return -EINVAL;
59@@ -94,12 +98,15 @@ static ssize_t driver_override_store(struct device *_dev,
60 if (cp)
61 *cp = '\0';
62
63+ device_lock(_dev);
64+ old = dev->driver_override;
65 if (strlen(driver_override)) {
66 dev->driver_override = driver_override;
67 } else {
68 kfree(driver_override);
69 dev->driver_override = NULL;
70 }
71+ device_unlock(_dev);
72
73 kfree(old);
74
75--
76
77