Skip to content

Commit c01ace7

Browse files
adriansmgregkh
authored andcommitted
driver core: platform: fix race condition with driver_override
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: 3d713e0 ("driver core: platform: add device binding path 'driver_override'") Cc: stable@vger.kernel.org Signed-off-by: Adrian Salido <salidoa@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 4043d5b commit c01ace7

1 file changed

Lines changed: 9 additions & 2 deletions

File tree

drivers/base/platform.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ static ssize_t driver_override_store(struct device *dev,
807807
const char *buf, size_t count)
808808
{
809809
struct platform_device *pdev = to_platform_device(dev);
810-
char *driver_override, *old = pdev->driver_override, *cp;
810+
char *driver_override, *old, *cp;
811811

812812
if (count > PATH_MAX)
813813
return -EINVAL;
@@ -820,12 +820,15 @@ static ssize_t driver_override_store(struct device *dev,
820820
if (cp)
821821
*cp = '\0';
822822

823+
device_lock(dev);
824+
old = pdev->driver_override;
823825
if (strlen(driver_override)) {
824826
pdev->driver_override = driver_override;
825827
} else {
826828
kfree(driver_override);
827829
pdev->driver_override = NULL;
828830
}
831+
device_unlock(dev);
829832

830833
kfree(old);
831834

@@ -836,8 +839,12 @@ static ssize_t driver_override_show(struct device *dev,
836839
struct device_attribute *attr, char *buf)
837840
{
838841
struct platform_device *pdev = to_platform_device(dev);
842+
ssize_t len;
839843

840-
return sprintf(buf, "%s\n", pdev->driver_override);
844+
device_lock(dev);
845+
len = sprintf(buf, "%s\n", pdev->driver_override);
846+
device_unlock(dev);
847+
return len;
841848
}
842849
static DEVICE_ATTR_RW(driver_override);
843850

0 commit comments

Comments
 (0)