VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-45902

CVE-2026-45902

Description

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

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

Using the devm_ variant for requesting IRQ _before_ the devm_ variant for allocating/registering the power_supply handle, means that the power_supply handle will be deallocated/unregistered _before_ the interrupt handler (since devm_ naturally deallocates in reverse allocation order). This means that during removal, there is a race condition where an interrupt can fire just _after_ the power_supply handle has been freed, *but* just _before_ the corresponding unregistration of the IRQ handler has run.

This will lead to the IRQ handler calling power_supply_changed() with a freed power_supply handle. Which usually crashes the system or otherwise silently corrupts the memory...

Note that there is a similar situation which can also happen during probe(); the possibility of an interrupt firing _before_ registering the power_supply handle. This would then lead to the nasty situation of using the power_supply handle *uninitialized* in power_supply_changed().

Fix this racy use-after-free by making sure the IRQ is requested _after_ the registration of the power_supply handle.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

In the Linux kernel bq256xx driver, devm_ IRQ request before power_supply registration causes a use-after-free race in power_supply_changed().

Vulnerability

In the Linux kernel bq256xx power supply driver, a use-after-free vulnerability exists due to ordering of devm_ resource allocations. The driver requests the IRQ using the devm_ variant *before* allocating and registering the power_supply handle (also using devm_). Because devm_ deallocates resources in reverse order, the power_supply handle is freed *before* the IRQ handler is unregistered. This creates a race condition during device removal, where an interrupt can fire just after the power_supply handle is freed but before the IRQ handler is unregistered, leading to power_supply_changed() being called with a freed pointer. A similar race exists during probe, where an interrupt can fire before the power_supply handle is registered, causing power_supply_changed() to use an uninitialized handle. The affected driver is in the Linux kernel; the fix was applied to the stable kernels as referenced [1].

Exploitation

An attacker does not directly control the timing of interrupts; exploitation requires triggering a device removal (e.g., via hot-unplug or driver unbind) while an interrupt races with the deallocation. Alternatively, during probe, an interrupt could arrive before registration is complete. No special privileges are needed beyond the ability to cause device removal or have the device generate an interrupt at the right moment. The race window is small, making exploitation difficult but possible. The attack is entirely local (requires physical presence or access to the device topology) and does not involve network access.

Impact

A successful race results in a use-after-free condition, where power_supply_changed() operates on freed or uninitialized memory. This typically causes a system crash (denial of service) but could potentially lead to memory corruption. Privilege escalation or information disclosure are not described in the references, but any use-after-free in kernel context is considered a security risk that may lead to code execution under certain circumstances, though the primary impact here is system instability and potential denial of service.

Mitigation

The fix is to reorder the initialization so that the IRQ is requested *after* the power_supply handle is registered. The commit referenced [1] implements this fix. It was applied to the Linux kernel stable tree. Users should update to a kernel version containing the fix. No workaround is described; the vulnerability is addressed only by applying the patch. The CVE is not listed on CISA's Known Exploited Vulnerabilities catalog as of the publication date.

AI Insight generated on May 27, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected products

1

Patches

14
800584336972

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 7.0via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 3eb17339400547..563f512709b389 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1740,6 +1740,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1752,12 +1758,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 3eb17339400547..563f512709b389 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1740,6 +1740,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1752,12 +1758,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
81d3688c9a21

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 5.15.202via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 9fb7b44e890af2..86f8ce4035209a 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1675,6 +1675,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1687,12 +1693,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 9fb7b44e890af2..86f8ce4035209a 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1675,6 +1675,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1687,12 +1693,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
74b5a88318db

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 6.1.165via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 686eb8d86e221c..e75283006d29c1 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1678,6 +1678,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1690,12 +1696,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 686eb8d86e221c..e75283006d29c1 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1678,6 +1678,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1690,12 +1696,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
cb5c743936ed

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 6.6.128via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index c8368dae69c712..2b0216d32d5f77 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1746,6 +1746,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1758,12 +1764,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index c8368dae69c712..2b0216d32d5f77 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1746,6 +1746,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1758,12 +1764,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
83c27fdd696a

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 6.12.75via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 5514d1896bb847..b47b73ed642e52 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 5514d1896bb847..b47b73ed642e52 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
4b6fb0b6124f

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 6.18.14via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
8796910131a3

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitWaqar HameedDec 20, 2025Fixed in 6.19.4via kernel-cna
2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
800584336972

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 3eb17339400547..563f512709b389 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1740,6 +1740,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1752,12 +1758,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 3eb17339400547..563f512709b389 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1740,6 +1740,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1752,12 +1758,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
4b6fb0b6124f

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
74b5a88318db

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 686eb8d86e221c..e75283006d29c1 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1678,6 +1678,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1690,12 +1696,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 686eb8d86e221c..e75283006d29c1 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1678,6 +1678,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1690,12 +1696,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
81d3688c9a21

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 9fb7b44e890af2..86f8ce4035209a 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1675,6 +1675,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1687,12 +1693,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 9fb7b44e890af2..86f8ce4035209a 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1675,6 +1675,12 @@ static int bq256xx_probe(struct i2c_client *client,
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1687,12 +1693,6 @@ static int bq256xx_probe(struct i2c_client *client,
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
83c27fdd696a

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 5514d1896bb847..b47b73ed642e52 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index 5514d1896bb847..b47b73ed642e52 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
8796910131a3

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index ae14162f017a9e..d3de4f8b80db1e 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1741,6 +1741,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1753,12 +1759,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
cb5c743936ed

power: supply: bq256xx: Fix use-after-free in power_supply_changed()

2 files changed · +12 14
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index c8368dae69c712..2b0216d32d5f77 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1746,6 +1746,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1758,12 +1764,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/bq256xx_charger.c+6 7 modified
    diff --git a/drivers/power/supply/bq256xx_charger.c b/drivers/power/supply/bq256xx_charger.c
    index c8368dae69c712..2b0216d32d5f77 100644
    --- a/drivers/power/supply/bq256xx_charger.c
    +++ b/drivers/power/supply/bq256xx_charger.c
    @@ -1746,6 +1746,12 @@ static int bq256xx_probe(struct i2c_client *client)
     		usb_register_notifier(bq->usb3_phy, &bq->usb_nb);
     	}
     
    +	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    +	if (ret) {
    +		dev_err(dev, "Failed to register power supply\n");
    +		return ret;
    +	}
    +
     	if (client->irq) {
     		ret = devm_request_threaded_irq(dev, client->irq, NULL,
     						bq256xx_irq_handler_thread,
    @@ -1758,12 +1764,6 @@ static int bq256xx_probe(struct i2c_client *client)
     		}
     	}
     
    -	ret = bq256xx_power_supply_init(bq, &psy_cfg, dev);
    -	if (ret) {
    -		dev_err(dev, "Failed to register power supply\n");
    -		return ret;
    -	}
    -
     	ret = bq256xx_hw_init(bq);
     	if (ret) {
     		dev_err(dev, "Cannot initialize the chip.\n");
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Incorrect ordering of devm-managed resource allocations causes a use-after-free race where the power_supply handle is freed before the IRQ handler is unregistered."

Attack vector

An attacker who can trigger a hardware interrupt on the BQ256XX charger chip (e.g., by manipulating charging conditions) during driver removal can cause the IRQ handler `bq256xx_irq_handler_thread` to call `power_supply_changed()` with a freed `power_supply` handle [patch_id=2661522]. Similarly, during probe, an interrupt arriving before `bq256xx_power_supply_init()` completes would cause `power_supply_changed()` to use an uninitialized handle. No special network path or authentication is required; the race window exists during normal device plug/unplug or module load/unload sequences.

Affected code

The vulnerability is in the `bq256xx_probe()` function in `drivers/power/supply/bq256xx_charger.c` [patch_id=2661522]. The original code called `devm_request_threaded_irq()` (via the `devm_` managed IRQ API) _before_ calling `bq256xx_power_supply_init()` which registers the `power_supply` handle. Because `devm_` resources are freed in reverse allocation order, the `power_supply` handle could be freed while the IRQ handler was still registered.

What the fix does

The patch swaps the order of two calls in `bq256xx_probe()`: `bq256xx_power_supply_init()` (which registers the `power_supply` handle) is moved _before_ `devm_request_threaded_irq()` (which registers the IRQ handler) [patch_id=2661522]. Because `devm_` resources are freed in reverse order, the IRQ handler will now be unregistered _before_ the `power_supply` handle is freed during removal. This closes both the use-after-free race on removal and the uninitialized-handle race during probe.

Preconditions

  • configThe system must have a BQ256XX charger chip connected via I2C with an interrupt line configured.
  • inputThe attacker must be able to trigger a hardware interrupt on the charger chip (e.g., by changing charging state) during the driver removal or probe window.

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

7

News mentions

0

No linked articles in our index yet.