patch "ARM: amba: Fix race condition with driver_override" added to char-misc-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ARM: amba: Fix race condition with driver_override
to my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
6b614a87f3f477571e319281e84dba11e0ea0a76Mon Sep 17 00:00:00 2001
From: Geert Uytterhoeven <[email protected]>
Date: Tue, 10 Apr 2018 15:21:44 +0200
Subject: ARM: amba: Fix race condition with driver_override
The driver_override implementation is susceptible to a race condition when different threads are reading vs storing a different driver override. Add locking to avoid this race condition.
Cfr. commits 6265539776a0810b ("driver core: platform: fix race condition with driver_override") and 9561475db680f714 ("PCI: Fix race condition with driver_override").
--- drivers/amba/bus.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/amba/bus.c +9 -2
@@ -69,11 +69,15 @@ static ssize_t driver_override_show(struct device *_dev, struct device_attribute *attr, char *buf) { struct amba_device *dev = to_amba_device(_dev); +ssize_t len;if (!dev->driver_override)return 0 ; -return sprintf (buf,"%s\n" , dev->driver_override); +device_lock (_dev); + len =sprintf (buf,"%s\n" , dev->driver_override); +device_unlock (_dev); +return len; } static ssize_t driver_override_store(struct device *_dev,
@@ -81,7 +85,7 @@ static ssize_t driver_override_store(struct device *_dev, const char *buf, size_t count) {struct amba_device *dev =to_amba_device (_dev); -char *driver_override, *old = dev->driver_override, *cp; +char *driver_override, *old, *cp;if (count >PATH_MAX )return -EINVAL ;
@@ -94,12 +98,15 @@ static ssize_t driver_override_store(struct device *_dev,if (cp) *cp ='\0' ; +device_lock (_dev); + old = dev->driver_override;if (strlen (driver_override)) { dev->driver_override = driver_override; }else {kfree (driver_override); dev->driver_override =NULL ; } +device_unlock (_dev);kfree (old);
Signature · 1 line
2.17.0
Hi Greg,
Quoted 8 lines · On Wed, Apr 25, 2018 at 6:07 PM, <[email protected]> wrote:
This is a note to let you know that I've just added the patch titled
ARM: amba: Fix race condition with
driver_overrideto my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-linus branch.
Quoted 7 lines
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Doh, I hadn't noticed you modified my patch, and introduced a bug...
Quoted 27 lines
From
6b614a87f3f477571e319281e84dba11e0ea0a76Mon Sep 17 00:00:00 2001
From: Geert Uytterhoeven <[email protected]>
Date: Tue, 10 Apr 2018 15:21:44 +0200
Subject: ARM: amba: Fix race condition withdriver_overrideThe
driver_overrideimplementation is susceptible to a race condition when different threads are reading vs storing a different driver override. Add locking to avoid this race condition.Cfr. commits
6265539776a0810b("driver core: platform: fix race condition withdriver_override") and9561475db680f714("PCI: Fix race condition withdriver_override").Fixes 3cf385713460eb2b ("ARM: 8256/1: driver coamba: add device binding path 'driver_override'")Signed-off-by Geert Uytterhoeven <[email protected]>Reviewed-by Todd Kjos <[email protected]>Cc stable <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/amba/bus.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)drivers/amba/bus.c +0
-0
drivers/amba/bus.c static ssize_t driver_override_show(struct device *_dev, · line 75
Quoted 7 lines
drivers/amba/bus.c +1
-0@@ -69,11 +69,15 @@ static ssize_t driver_override_show(struct device *_dev, struct device_attribute *attr, char *buf) { struct amba_device *dev = to_amba_device(_dev); +ssize_t len;if (!dev->driver_override)return 0 ;
With the above still present, it should be covered by the lock below, too. Else the output is still subject to the race condition.
Quoted 38 lines
drivers/amba/bus.c +8
-3-return sprintf (buf,"%s\n" , dev->driver_override); +device_lock (_dev); + len =sprintf (buf,"%s\n" , dev->driver_override); +device_unlock (_dev); +return len; } static ssize_t driver_override_store(struct device *_dev,@@ -81,7 +85,7 @@ static ssize_t driver_override_store(struct device *_dev, const char *buf, size_t count) {struct amba_device *dev =to_amba_device (_dev); -char *driver_override, *old = dev->driver_override, *cp; +char *driver_override, *old, *cp;if (count >PATH_MAX )return -EINVAL ;@@ -94,12 +98,15 @@ static ssize_t driver_override_store(struct device *_dev,if (cp) *cp ='\0' ; +device_lock (_dev); + old = dev->driver_override;if (strlen (driver_override)) { dev->driver_override = driver_override; }else {kfree (driver_override); dev->driver_override =NULL ; } +device_unlock (_dev);kfree (old); --2.17.0
Signature · 10 lines
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds