CVE-2024-50196

pinctrl: ocelot: fix system hang on level based interrupts

Medium · published November 8, 2024

CVSS v3.1
5.5
EPSS
0%
Percentile
10.2
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

pinctrl: ocelot: fix system hang on level based interrupts

The current implementation only calls chained_irq_enter() and

chained_irq_exit() if it detects pending interrupts.

```

for (i = 0; i < info->stride; i++) {

uregmap_read(info->map, id_reg + 4 * i, &reg);

if (!reg)

continue;

chained_irq_enter(parent_chip, desc);

```

However, in case of GPIO pin configured in level mode and the parent

controller configured in edge mode, GPIO interrupt might be lowered by the

hardware. In the result, if the interrupt is short enough, the parent

interrupt is still pending while the GPIO interrupt is cleared;

chained_irq_enter() never gets called and the system hangs trying to

service the parent interrupt.

Moving chained_irq_enter() and chained_irq_exit() outside the for loop

ensures that they are called even when GPIO interrupt is lowered by the

hardware.

The similar code with chained_irq_enter() / chained_irq_exit() functions

wrapping interrupt checking loop may be found in many other drivers:

```

grep -r -A 10 chained_irq_enter drivers/pinctrl

```

The record
Technical detail
CVSS v3.1
5.5 · MEDIUM
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
CVSS v4.0
Not supplied
EPSS
0.00207 · 10.2th percentile
Published
2024-11-08T05:54Z
EPSS history
Timeline
  • 08 NOV 05:54Z
    pinctrl: ocelot: fix system hang on level based interrupts
    cvelistv5