From: Greg Kroah-Hartman Date: Fri, 7 Jul 2017 07:51:42 +0000 (+0200) Subject: 4.12-stable patches X-Git-Tag: v4.9.37~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=33ee35ed4b4bf82c4f7f3468b804b74b4b70e07a;p=thirdparty%2Fkernel%2Fstable-queue.git 4.12-stable patches added patches: driver-core-platform-fix-race-condition-with-driver_override.patch --- diff --git a/queue-4.12/driver-core-platform-fix-race-condition-with-driver_override.patch b/queue-4.12/driver-core-platform-fix-race-condition-with-driver_override.patch new file mode 100644 index 00000000000..d1e0120ec21 --- /dev/null +++ b/queue-4.12/driver-core-platform-fix-race-condition-with-driver_override.patch @@ -0,0 +1,63 @@ +From 6265539776a0810b7ce6398c27866ddb9c6bd154 Mon Sep 17 00:00:00 2001 +From: Adrian Salido +Date: Tue, 25 Apr 2017 16:55:26 -0700 +Subject: driver core: platform: fix race condition with driver_override + +From: Adrian Salido + +commit 6265539776a0810b7ce6398c27866ddb9c6bd154 upstream. + +The driver_override implementation is susceptible to race condition when +different threads are reading vs storing a different driver override. +Add locking to avoid race condition. + +Fixes: 3d713e0e382e ("driver core: platform: add device binding path 'driver_override'") +Cc: stable@vger.kernel.org +Signed-off-by: Adrian Salido +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/base/platform.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +--- a/drivers/base/platform.c ++++ b/drivers/base/platform.c +@@ -866,7 +866,7 @@ static ssize_t driver_override_store(str + const char *buf, size_t count) + { + struct platform_device *pdev = to_platform_device(dev); +- char *driver_override, *old = pdev->driver_override, *cp; ++ char *driver_override, *old, *cp; + + if (count > PATH_MAX) + return -EINVAL; +@@ -879,12 +879,15 @@ static ssize_t driver_override_store(str + if (cp) + *cp = '\0'; + ++ device_lock(dev); ++ old = pdev->driver_override; + if (strlen(driver_override)) { + pdev->driver_override = driver_override; + } else { + kfree(driver_override); + pdev->driver_override = NULL; + } ++ device_unlock(dev); + + kfree(old); + +@@ -895,8 +898,12 @@ static ssize_t driver_override_show(stru + struct device_attribute *attr, char *buf) + { + struct platform_device *pdev = to_platform_device(dev); ++ ssize_t len; + +- return sprintf(buf, "%s\n", pdev->driver_override); ++ device_lock(dev); ++ len = sprintf(buf, "%s\n", pdev->driver_override); ++ device_unlock(dev); ++ return len; + } + static DEVICE_ATTR_RW(driver_override); +