Linux kernel -stable discussions
 help / color / mirror / Atom feed
* [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
@ 2024-12-13 10:31 guocai.he.cn
  2024-12-13 10:45 ` Harshit Mogalapalli
  2024-12-13 15:13 ` Sasha Levin
  0 siblings, 2 replies; 4+ messages in thread
From: guocai.he.cn @ 2024-12-13 10:31 UTC (permalink / raw)
  To: stable; +Cc: gregkh, ian.ray, bartosz.golaszewski

From: Ian Ray <ian.ray@gehealthcare.com>

[ Upstream commit bfc6444b57dc7186b6acc964705d7516cbaf3904 ]

Ensure that `i2c_lock' is held when setting interrupt latch and mask in
pca953x_irq_bus_sync_unlock() in order to avoid races.

The other (non-probe) call site pca953x_gpio_set_multiple() ensures the
lock is held before calling pca953x_write_regs().

The problem occurred when a request raced against irq_bus_sync_unlock()
approximately once per thousand reboots on an i.MX8MP based system.

 * Normal case

   0-0022: write register AI|3a {03,02,00,00,01} Input latch P0
   0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0
   0-0022: write register AI|08 {ff,00,00,00,00} Output P3
   0-0022: write register AI|12 {fc,00,00,00,00} Config P3

 * Race case

   0-0022: write register AI|08 {ff,00,00,00,00} Output P3
   0-0022: write register AI|08 {03,02,00,00,01} *** Wrong register ***
   0-0022: write register AI|12 {fc,00,00,00,00} Config P3
   0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0

Signed-off-by: Ian Ray <ian.ray@gehealthcare.com>
Link: https://lore.kernel.org/r/20240620042915.2173-1-ian.ray@gehealthcare.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
---
This commit is to solve the CVE-2024-42253. Please merge this commit to linux-5.15.y.

 drivers/gpio/gpio-pca953x.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index 4860bf3b7e00..4e97b6ae4f72 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -672,6 +672,8 @@ static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
 	int level;
 
 	if (chip->driver_data & PCA_PCAL) {
+		guard(mutex)(&chip->i2c_lock);
+
 		/* Enable latch on interrupt-enabled inputs */
 		pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
  2024-12-13 10:31 [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race guocai.he.cn
@ 2024-12-13 10:45 ` Harshit Mogalapalli
  2024-12-13 11:08   ` Greg KH
  2024-12-13 15:13 ` Sasha Levin
  1 sibling, 1 reply; 4+ messages in thread
From: Harshit Mogalapalli @ 2024-12-13 10:45 UTC (permalink / raw)
  To: guocai.he.cn, stable; +Cc: gregkh, ian.ray, bartosz.golaszewski

Hi Guocai,

On 13/12/24 16:01, guocai.he.cn@windriver.com wrote:
> From: Ian Ray <ian.ray@gehealthcare.com>
> 
> [ Upstream commit bfc6444b57dc7186b6acc964705d7516cbaf3904 ]
> 
> Ensure that `i2c_lock' is held when setting interrupt latch and mask in
> pca953x_irq_bus_sync_unlock() in order to avoid races.
> 
> The other (non-probe) call site pca953x_gpio_set_multiple() ensures the
> lock is held before calling pca953x_write_regs().
> 
> The problem occurred when a request raced against irq_bus_sync_unlock()
> approximately once per thousand reboots on an i.MX8MP based system.
> 
>   * Normal case
> 
>     0-0022: write register AI|3a {03,02,00,00,01} Input latch P0
>     0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0
>     0-0022: write register AI|08 {ff,00,00,00,00} Output P3
>     0-0022: write register AI|12 {fc,00,00,00,00} Config P3
> 
>   * Race case
> 
>     0-0022: write register AI|08 {ff,00,00,00,00} Output P3
>     0-0022: write register AI|08 {03,02,00,00,01} *** Wrong register ***
>     0-0022: write register AI|12 {fc,00,00,00,00} Config P3
>     0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0
> 
> Signed-off-by: Ian Ray <ian.ray@gehealthcare.com>
> Link: https://lore.kernel.org/r/20240620042915.2173-1-ian.ray@gehealthcare.com
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
> ---
> This commit is to solve the CVE-2024-42253. Please merge this commit to linux-5.15.y.
> 
>   drivers/gpio/gpio-pca953x.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index 4860bf3b7e00..4e97b6ae4f72 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -672,6 +672,8 @@ static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
>   	int level;
>   
>   	if (chip->driver_data & PCA_PCAL) {
> +		guard(mutex)(&chip->i2c_lock);

This wouldn't compile on 5.15.y

We don't have scope based locking backported to 5.15.y.


drivers/gpio/gpio-pca953x.c: In function ‘pca953x_irq_bus_sync_unlock’:
drivers/gpio/gpio-pca953x.c:675:17: error: implicit declaration of 
function ‘guard’ [-Werror=implicit-function-declaration]
   675 |                 guard(mutex)(&chip->i2c_lock);
       |                 ^~~~~
drivers/gpio/gpio-pca953x.c:675:23: error: ‘mutex’ undeclared (first use 
in this function)
   675 |                 guard(mutex)(&chip->i2c_lock);
       |                       ^~~~~
drivers/gpio/gpio-pca953x.c:675:23: note: each undeclared identifier is 
reported only once for each function it appears in
cc1: all warnings being treated as errors



Thanks,
Harshit
> +
>   		/* Enable latch on interrupt-enabled inputs */
>   		pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask);
>   


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
  2024-12-13 10:45 ` Harshit Mogalapalli
@ 2024-12-13 11:08   ` Greg KH
  0 siblings, 0 replies; 4+ messages in thread
From: Greg KH @ 2024-12-13 11:08 UTC (permalink / raw)
  To: Harshit Mogalapalli, guocai.he.cn, stable, ian.ray,
	bartosz.golaszewski

On Fri, Dec 13, 2024 at 04:15:09PM +0530, Harshit Mogalapalli wrote:
> Hi Guocai,
> 
> On 13/12/24 16:01, guocai.he.cn@windriver.com wrote:
> > From: Ian Ray <ian.ray@gehealthcare.com>
> > 
> > [ Upstream commit bfc6444b57dc7186b6acc964705d7516cbaf3904 ]
> > 
> > Ensure that `i2c_lock' is held when setting interrupt latch and mask in
> > pca953x_irq_bus_sync_unlock() in order to avoid races.
> > 
> > The other (non-probe) call site pca953x_gpio_set_multiple() ensures the
> > lock is held before calling pca953x_write_regs().
> > 
> > The problem occurred when a request raced against irq_bus_sync_unlock()
> > approximately once per thousand reboots on an i.MX8MP based system.
> > 
> >   * Normal case
> > 
> >     0-0022: write register AI|3a {03,02,00,00,01} Input latch P0
> >     0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0
> >     0-0022: write register AI|08 {ff,00,00,00,00} Output P3
> >     0-0022: write register AI|12 {fc,00,00,00,00} Config P3
> > 
> >   * Race case
> > 
> >     0-0022: write register AI|08 {ff,00,00,00,00} Output P3
> >     0-0022: write register AI|08 {03,02,00,00,01} *** Wrong register ***
> >     0-0022: write register AI|12 {fc,00,00,00,00} Config P3
> >     0-0022: write register AI|49 {fc,fd,ff,ff,fe} Interrupt mask P0
> > 
> > Signed-off-by: Ian Ray <ian.ray@gehealthcare.com>
> > Link: https://lore.kernel.org/r/20240620042915.2173-1-ian.ray@gehealthcare.com
> > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
> > ---
> > This commit is to solve the CVE-2024-42253. Please merge this commit to linux-5.15.y.
> > 
> >   drivers/gpio/gpio-pca953x.c | 2 ++
> >   1 file changed, 2 insertions(+)
> > 
> > diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> > index 4860bf3b7e00..4e97b6ae4f72 100644
> > --- a/drivers/gpio/gpio-pca953x.c
> > +++ b/drivers/gpio/gpio-pca953x.c
> > @@ -672,6 +672,8 @@ static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
> >   	int level;
> >   	if (chip->driver_data & PCA_PCAL) {
> > +		guard(mutex)(&chip->i2c_lock);
> 
> This wouldn't compile on 5.15.y

Which means that no one is actually testing these backports.

Ok, I'm frustrated enough.  No more windriver backports for stable trees
will now be accepted until you all get your act together and figure out
how to do this properly.

As to "how" you prove that you all know what you are doing, I will
leave that up to you to come up with a proper proposal and proof.

ugh.

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
  2024-12-13 10:31 [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race guocai.he.cn
  2024-12-13 10:45 ` Harshit Mogalapalli
@ 2024-12-13 15:13 ` Sasha Levin
  1 sibling, 0 replies; 4+ messages in thread
From: Sasha Levin @ 2024-12-13 15:13 UTC (permalink / raw)
  To: stable; +Cc: guocai.he.cn, Sasha Levin

[ Sasha's backport helper bot ]

Hi,

The upstream commit SHA1 provided is correct: bfc6444b57dc7186b6acc964705d7516cbaf3904

WARNING: Author mismatch between patch and upstream commit:
Backport author: guocai.he.cn@windriver.com
Commit author: Ian Ray <ian.ray@gehealthcare.com>


Status in newer kernel trees:
6.12.y | Present (exact SHA1)
6.6.y | Present (different SHA1: e2ecdddca80d)
6.1.y | Present (different SHA1: 58a5c93bd1a6)
5.15.y | Not found

Note: The patch differs from the upstream commit:
---
1:  bfc6444b57dc7 ! 1:  3812c0bc93e5e gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
    @@ Metadata
      ## Commit message ##
         gpio: pca953x: fix pca953x_irq_bus_sync_unlock race
     
    +    [ Upstream commit bfc6444b57dc7186b6acc964705d7516cbaf3904 ]
    +
         Ensure that `i2c_lock' is held when setting interrupt latch and mask in
         pca953x_irq_bus_sync_unlock() in order to avoid races.
     
    @@ Commit message
         Signed-off-by: Ian Ray <ian.ray@gehealthcare.com>
         Link: https://lore.kernel.org/r/20240620042915.2173-1-ian.ray@gehealthcare.com
         Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
    +    Signed-off-by: Guocai He <guocai.he.cn@windriver.com>
     
      ## drivers/gpio/gpio-pca953x.c ##
     @@ drivers/gpio/gpio-pca953x.c: static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
---

Results of testing on various branches:

| Branch                    | Patch Apply | Build Test |
|---------------------------|-------------|------------|
| stable/linux-5.15.y       |  Success    |  Failed    |

Build Errors:
Build error for stable/linux-5.15.y:
    drivers/gpio/gpio-pca953x.c: In function 'pca953x_irq_bus_sync_unlock':
    drivers/gpio/gpio-pca953x.c:675:17: error: implicit declaration of function 'guard' [-Werror=implicit-function-declaration]
      675 |                 guard(mutex)(&chip->i2c_lock);
          |                 ^~~~~
    drivers/gpio/gpio-pca953x.c:675:23: error: 'mutex' undeclared (first use in this function)
      675 |                 guard(mutex)(&chip->i2c_lock);
          |                       ^~~~~
    drivers/gpio/gpio-pca953x.c:675:23: note: each undeclared identifier is reported only once for each function it appears in
    cc1: some warnings being treated as errors
    make[2]: *** [scripts/Makefile.build:289: drivers/gpio/gpio-pca953x.o] Error 1
    make[2]: Target '__build' not remade because of errors.
    make[1]: *** [scripts/Makefile.build:552: drivers/gpio] Error 2
    make[1]: Target '__build' not remade because of errors.
    make: *** [Makefile:1906: drivers] Error 2
    make: Target '__all' not remade because of errors.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-12-13 15:13 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-13 10:31 [PATCH][5.15.y] gpio: pca953x: fix pca953x_irq_bus_sync_unlock race guocai.he.cn
2024-12-13 10:45 ` Harshit Mogalapalli
2024-12-13 11:08   ` Greg KH
2024-12-13 15:13 ` Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox