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

i2c: dev: prevent integer overflow in I2C_TIMEOUT ioctl

While fuzzing with Syzkaller, a persistent `schedule_timeout: wrong
timeout value` warning was observed, accompanied by SMBus controller
state machine corruption.

The I2C_TIMEOUT ioctl accepts a user-provided timeout in multiples of
10 ms. The user argument is checked against INT_MAX, but it is
subsequently multiplied by 10 before being passed to msecs_to_jiffies().

A malicious user can pass a large value (e.g., 429496729) that passes
the `arg > INT_MAX` check but overflows when multiplied by 10. This
results in a truncated 32-bit unsigned value that bypasses the
internal `(int)m < 0` check in `msecs_to_jiffies()`.

The truncated value is then assigned to `client->adapter->timeout`
(a signed 32-bit int), which is reinterpreted as a negative number.
When passed to wait_for_completion_timeout(), this negative value
undergoes sign extension to a 64-bit unsigned long, triggering the
`schedule_timeout` warning and causing premature returns. This leaves
the SMBus state machine in an unrecoverable state, constituting a
local Denial of Service (DoS).

Fix this by bounding the user argument to `INT_MAX / 10`.

[wsa: move the comment as well]
Published: 2026-06-24
Score: n/a
EPSS: < 1% Very Low
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

The flaw occurs in the Linux kernel I2C driver when handling the I2C_TIMEOUT ioctl. A user can supply a timeout value that passes the initial INT_MAX check but, after being multiplied by ten, overflows a 32‑bit integer. The truncated result is then cast to a signed 32‑bit value, interpreted as a negative number, and used in a wait_for_completion_timeout call. The negative value is sign‑extended to an unsigned 64‑bit variable, causing the scheduler to emit a warning and return prematurely, leaving the SMBus controller in an unrecoverable state. An attacker can exploit this locally to trigger a denial of service on an affected device.

Affected Systems

All Linux kernel systems that include the i2c-dev driver are affected. The vulnerability is present in any kernel version that has the bug in the I2C_TIMEOUT ioctl handling before the patch that limits the input to INT_MAX/10. Specific version ranges are not listed, so any unpatched kernel should be considered vulnerable.

Risk and Exploitability

The issue is local; a user with access to the /dev/i2c* device can trigger the overflow. The EPSS score is unavailable and the vulnerability is not in CISA KEV, but the CVSS severity is implied to be high due to the direct local denial of service and the likelihood of exploitation via a standard ioctl interface. The bug can be triggered without special privileges beyond those required to access the device, so any untrusted process that can open the device risks bringing the system to a stopped state by corrupting the SMBus state machine.

Generated by OpenCVE AI on June 24, 2026 at 18:28 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Apply a kernel update that adds the INT_MAX/10 bound to the I2C_TIMEOUT ioctl input
  • Ensure /dev/i2c* device files are only readable/writable by privileged users or the specific service that requires access
  • Monitor system logs for the 'schedule_timeout: wrong timeout value' warning and take corrective action if it appears

Generated by OpenCVE AI on June 24, 2026 at 18:28 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Wed, 24 Jun 2026 17:15:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: i2c: dev: prevent integer overflow in I2C_TIMEOUT ioctl While fuzzing with Syzkaller, a persistent `schedule_timeout: wrong timeout value` warning was observed, accompanied by SMBus controller state machine corruption. The I2C_TIMEOUT ioctl accepts a user-provided timeout in multiples of 10 ms. The user argument is checked against INT_MAX, but it is subsequently multiplied by 10 before being passed to msecs_to_jiffies(). A malicious user can pass a large value (e.g., 429496729) that passes the `arg > INT_MAX` check but overflows when multiplied by 10. This results in a truncated 32-bit unsigned value that bypasses the internal `(int)m < 0` check in `msecs_to_jiffies()`. The truncated value is then assigned to `client->adapter->timeout` (a signed 32-bit int), which is reinterpreted as a negative number. When passed to wait_for_completion_timeout(), this negative value undergoes sign extension to a 64-bit unsigned long, triggering the `schedule_timeout` warning and causing premature returns. This leaves the SMBus state machine in an unrecoverable state, constituting a local Denial of Service (DoS). Fix this by bounding the user argument to `INT_MAX / 10`. [wsa: move the comment as well]
Title i2c: dev: prevent integer overflow in I2C_TIMEOUT ioctl
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-06-24T16:26:05.719Z

Reserved: 2026-06-09T07:44:35.371Z

Link: CVE-2026-52948

cve-icon Vulnrichment

No data.

cve-icon NVD

No data.

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-06-24T20:40:36Z

Weaknesses

No weakness.