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

CVE-2026-45946

CVE-2026-45946

Description

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

power: supply: ab8500: 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().

Commit 1c1f13a006ed ("power: supply: ab8500: Move to componentized binding") introduced this issue during a refactorization. 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.

Use-after-free in ab8500 power supply driver due to incorrect devm_ ordering of IRQ and power_supply registration.

Vulnerability

In the Linux kernel's ab8500 power supply driver, a use-after-free exists in power_supply_changed() due to incorrect ordering of devm_ resource allocations. The driver registers the IRQ handler before allocating and registering the power_supply handle using devm_ variants. Since devm_ deallocates in reverse order, during removal the power_supply handle is freed before the IRQ handler is unregistered, creating a race condition. The same ordering issue can also cause an uninitialized handle during probe if an interrupt fires before registration. This issue was introduced by commit 1c1f13a006ed ("power: supply: ab8500: Move to componentized binding"). The vulnerability affects Linux kernel versions incorporating that commit.

Exploitation

An attacker needs local access to trigger the removal of the ab8500 power supply device (e.g., via hotplug or module removal). The race window occurs when an interrupt fires after the power_supply handle has been freed but before the IRQ handler is unregistered. The attacker must ensure that the removal process is interrupted by an appropriate hardware event (e.g., a battery status change) that triggers the IRQ. No authentication or special privileges beyond local access are required.

Impact

Successful exploitation leads to a use-after-free condition when power_supply_changed() is called with a freed power_supply handle. This typically results in a kernel crash (denial of service) or, potentially, silent memory corruption that could be leveraged for further compromise. The attacker does not gain elevated privileges but can cause system instability or data integrity issues.

Mitigation

The fix is committed in the Linux kernel as commit f50433f2603def08b21a4bf2fd238687fb5cbde9 [1], which reorders the IRQ registration to occur after power_supply allocation and registration. Users should apply this patch or update to a kernel version that includes it. The issue was introduced in version containing commit 1c1f13a006ed and fixed in the referenced commit. No workaround is available; updating the kernel is the only mitigation.

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
46dbda27b028

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
43cbb78ee047

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 6af946ca06a94a..cce2f3c13b7978 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3457,26 +3457,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3607,6 +3587,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 6af946ca06a94a..cce2f3c13b7978 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3457,26 +3457,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3607,6 +3587,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
551672981fe2

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 58757a5799f8b8..b497c4c370faae 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 58757a5799f8b8..b497c4c370faae 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
f50433f2603d

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 308e68545d44d4..c6d513953b042b 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 308e68545d44d4..c6d513953b042b 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
709db4b476e2

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
c4af8a98bb52

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
847eeb6c0efc

power: supply: ab8500: 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 · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 93181ebfb32473..5da3b12d9f0bbd 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3467,26 +3467,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3615,6 +3595,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 93181ebfb32473..5da3b12d9f0bbd 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3467,26 +3467,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3615,6 +3595,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
f50433f2603d

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 308e68545d44d4..c6d513953b042b 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 308e68545d44d4..c6d513953b042b 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
43cbb78ee047

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 6af946ca06a94a..cce2f3c13b7978 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3457,26 +3457,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3607,6 +3587,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 6af946ca06a94a..cce2f3c13b7978 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3457,26 +3457,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3607,6 +3587,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
46dbda27b028

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
551672981fe2

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 58757a5799f8b8..b497c4c370faae 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 58757a5799f8b8..b497c4c370faae 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3456,26 +3456,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3604,6 +3584,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
709db4b476e2

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
847eeb6c0efc

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 93181ebfb32473..5da3b12d9f0bbd 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3467,26 +3467,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3615,6 +3595,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 93181ebfb32473..5da3b12d9f0bbd 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3467,26 +3467,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3615,6 +3595,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
c4af8a98bb52

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

2 files changed · +40 42
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/power/supply/ab8500_charger.c+20 21 modified
    diff --git a/drivers/power/supply/ab8500_charger.c b/drivers/power/supply/ab8500_charger.c
    index 5f4537766e5b90..1813fbdfa1c1f6 100644
    --- a/drivers/power/supply/ab8500_charger.c
    +++ b/drivers/power/supply/ab8500_charger.c
    @@ -3466,26 +3466,6 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return ret;
     	}
     
    -	/* Request interrupts */
    -	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    -		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    -		if (irq < 0)
    -			return irq;
    -
    -		ret = devm_request_threaded_irq(dev,
    -			irq, NULL, ab8500_charger_irq[i].isr,
    -			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    -			ab8500_charger_irq[i].name, di);
    -
    -		if (ret != 0) {
    -			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    -				, ab8500_charger_irq[i].name, irq, ret);
    -			return ret;
    -		}
    -		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    -			ab8500_charger_irq[i].name, irq, ret);
    -	}
    -
     	/* initialize lock */
     	spin_lock_init(&di->usb_state.usb_lock);
     	mutex_init(&di->usb_ipt_crnt_lock);
    @@ -3614,6 +3594,26 @@ static int ab8500_charger_probe(struct platform_device *pdev)
     		return PTR_ERR(di->usb_chg.psy);
     	}
     
    +	/* Request interrupts */
    +	for (i = 0; i < ARRAY_SIZE(ab8500_charger_irq); i++) {
    +		irq = platform_get_irq_byname(pdev, ab8500_charger_irq[i].name);
    +		if (irq < 0)
    +			return irq;
    +
    +		ret = devm_request_threaded_irq(dev,
    +			irq, NULL, ab8500_charger_irq[i].isr,
    +			IRQF_SHARED | IRQF_NO_SUSPEND | IRQF_ONESHOT,
    +			ab8500_charger_irq[i].name, di);
    +
    +		if (ret != 0) {
    +			dev_err(dev, "failed to request %s IRQ %d: %d\n"
    +				, ab8500_charger_irq[i].name, irq, ret);
    +			return ret;
    +		}
    +		dev_dbg(dev, "Requested %s IRQ %d: %d\n",
    +			ab8500_charger_irq[i].name, irq, ret);
    +	}
    +
     	/*
     	 * Check what battery we have, since we always have the USB
     	 * psy, use that as a handle.
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Incorrect devm resource ordering: IRQ handler registered before power_supply handle, causing use-after-free during removal and use-of-uninitialized during probe."

Attack vector

During device removal, the kernel's devm resource deallocation runs in reverse order of allocation. Because the IRQ was requested before the power_supply was registered, the power_supply handle gets freed first, while the IRQ handler is still registered. A hardware interrupt arriving in that window causes the handler to call `power_supply_changed()` with a freed `power_supply` pointer, leading to a use-after-free crash or memory corruption [patch_id=2661113]. A similar race exists during probe: an interrupt can fire before the power_supply handle is registered, causing the handler to use an uninitialized pointer [patch_id=2661113].

Affected code

The bug is in `drivers/power/supply/ab8500_charger.c` in the `ab8500_charger_probe()` function. The original code requested IRQs via `devm_request_threaded_irq()` _before_ registering the `power_supply` handle with `devm_power_supply_register()`, creating a dangerous ordering dependency [patch_id=2661113].

What the fix does

The patch moves the entire IRQ-request loop (`devm_request_threaded_irq`) to _after_ the `devm_power_supply_register()` call in `ab8500_charger_probe()` [patch_id=2661113]. This ensures that during removal, the IRQ handler is unregistered before the power_supply handle is freed, closing the use-after-free race. It also prevents the probe-time race where an interrupt could fire before the power_supply handle is initialized [patch_id=2661113].

Preconditions

  • configThe ab8500 charger driver must be loaded and bound to hardware.
  • inputThe system must be performing driver removal (unbind/rmmod) or probe must be in progress.
  • inputA hardware interrupt must fire in the race window between power_supply teardown and IRQ handler unregistration (or before power_supply registration during probe).

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.