CVE-2026-99215 (GCVE-0-2026-99215)
Vulnerability from cvelistv5
Published
2026-10-28 10:36
Modified
2026-10-28 10:36
Severity ?
Summary
In the Linux kernel, the following vulnerability has been resolved: power: supply: core: prevent unregistering a power supply while a callback runs Once a power supply is registered, its callbacks can immediately start firing from other contexts, such as external_power_changed() triggered by the TCPM stack. If a power supply is unregistered while the callback is still running, the driver data can already be freed when the callback tries to access it, leading to a use-after-free. This happens e.g. when the hardware bus carrying the power supply device malfunctions (e.g. I2C is hogged down by another malfunctioning device) immediately after the power supply is registered, and thus the core is still processing the callbacks which were queued up when the driver starts the removal, leading in some cases to a kernel crash, e.g.: [ 11.645942] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000005 [ 11.646751] Mem abort info: [ 11.647006] ESR = 0x0000000096000004 [ 11.647338] EC = 0x25: DABT (current EL), IL = 32 bits [ 11.647806] SET = 0, FnV = 0 [ 11.648077] EA = 0, S1PTW = 0 [ 11.648356] FSC = 0x04: level 0 translation fault [ 11.648785] Data abort info: [ 11.649041] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 11.649524] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 11.649981] GCS = 0, Overlay = 0, DirtyBit = 0 [ 11.650390] [0000000000000005] user address but active_mm is swapper [ 11.650955] Internal error: Oops: 0000000096000004 [#1] SMP [ 11.651460] Modules linked in: [ 11.651742] CPU: 1 UID: 0 PID: 144 Comm: kworker/1:2 Not tainted 7.2.0-rc6-g62a9297af2cd #1 PREEMPT [ 11.652553] Hardware name: Flipper One rev. F0B1C2 (DT) [ 11.653024] Workqueue: events power_supply_changed_work [ 11.653511] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 11.654135] pc : __power_supply_is_supplied_by+0x18/0x100 [ 11.654624] lr : __power_supply_am_i_supplied+0x40/0xb8 [ 11.655098] sp : ffff80008192bb30 [ 11.655399] x29: ffff80008192bb30 x28: 0000000000000000 x27: 0000000000000000 [ 11.656049] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000 [ 11.656695] x23: ffff0000c19f4200 x22: ffffdb2232ba4ea8 x21: ffff80008192bc28 [ 11.657344] x20: ffff0000c1eef000 x19: ffff80008192bc18 x18: 00000000a0886e62 [ 11.657991] x17: 000000040044ffff x16: 04500072b5503510 x15: 0000000000000000 [ 11.658639] x14: 0000000000000000 x13: 0000000000000220 x12: 0000000000000000 [ 11.659286] x11: 0000000000000000 x10: ffff0000c1fdb2b0 x9 : ffffdb2232ba5590 [ 11.659934] x8 : 00000000e5b906e6 x7 : ffff0000c2502778 x6 : ffffdb22339793d0 [ 11.660581] x5 : ffff80008192bc18 x4 : ffff0000c19cbca0 x3 : 0000000000000000 [ 11.661228] x2 : ffff0000c1fdaf40 x1 : ffffffffffffffed x0 : ffff0000c1eef000 [ 11.661878] Call trace: [ 11.662103] __power_supply_is_supplied_by+0x18/0x100 (P) [ 11.662596] __power_supply_am_i_supplied+0x40/0xb8 [ 11.663040] psy_for_each_psy_cb+0x20/0x40 [ 11.663416] class_for_each_device+0x110/0x150 [ 11.663825] power_supply_am_i_supplied+0x68/0x100 [ 11.664262] bq257xx_external_power_changed+0x58/0x140 [ 11.664733] __power_supply_changed_work+0x60/0x80 [ 11.665170] psy_for_each_psy_cb+0x20/0x40 [ 11.665545] class_for_each_device+0x110/0x150 [ 11.665953] power_supply_changed_work+0x98/0x1b8 [ 11.666382] process_one_work+0x164/0x4c0 [ 11.666758] worker_thread+0x19c/0x320 [ 11.667104] kthread+0x138/0x150 [ 11.667408] ret_from_fork+0x10/0x20 [ 11.667744] Code: d503233f a9bd7bfd 910003fd a90153f3 (f9400c34) [ 11.668294] ---[ end trace 0000000000000000 ]--- Add a read-write semaphore between external_power_changed() and power_supply_unregister() to prevent the latter from returning (and thus the driver from freeing its data) while the callback is still running.
Impacted products
Vendor Product Version
Linux Linux Version: bc1540561c9ede1efb6d7bf44804676d3d02a3cc
Version: bc1540561c9ede1efb6d7bf44804676d3d02a3cc
Version: bc1540561c9ede1efb6d7bf44804676d3d02a3cc
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "drivers/power/supply/power_supply_core.c",
            "include/linux/power_supply.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "2ac0256a28e15c4888fa394d1fe66cf7b1d58090",
              "status": "affected",
              "version": "bc1540561c9ede1efb6d7bf44804676d3d02a3cc",
              "versionType": "git"
            },
            {
              "lessThan": "45388e50d14bc161873b14b9a05d4b8b8822fca6",
              "status": "affected",
              "version": "bc1540561c9ede1efb6d7bf44804676d3d02a3cc",
              "versionType": "git"
            },
            {
              "lessThan": "5b4bd13e0552926648a46c2c9a12a24dfaee3715",
              "status": "affected",
              "version": "bc1540561c9ede1efb6d7bf44804676d3d02a3cc",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "drivers/power/supply/power_supply_core.c",
            "include/linux/power_supply.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "4.1"
            },
            {
              "lessThan": "4.1",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.59",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.13",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.3",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.59",
                  "versionStartIncluding": "4.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.13",
                  "versionStartIncluding": "4.1",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "4.1",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\npower: supply: core: prevent unregistering a power supply while a callback runs\n\nOnce a power supply is registered, its callbacks can immediately start\nfiring from other contexts, such as external_power_changed() triggered by\nthe TCPM stack. If a power supply is unregistered while the callback is\nstill running, the driver data can already be freed when the callback\ntries to access it, leading to a use-after-free.\n\nThis happens e.g. when the hardware bus carrying the power supply device\nmalfunctions (e.g. I2C is hogged down by another malfunctioning device)\nimmediately after the power supply is registered, and thus the core is\nstill processing the callbacks which were queued up when the driver\nstarts the removal, leading in some cases to a kernel crash, e.g.:\n\n[   11.645942] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000005\n[   11.646751] Mem abort info:\n[   11.647006]   ESR = 0x0000000096000004\n[   11.647338]   EC = 0x25: DABT (current EL), IL = 32 bits\n[   11.647806]   SET = 0, FnV = 0\n[   11.648077]   EA = 0, S1PTW = 0\n[   11.648356]   FSC = 0x04: level 0 translation fault\n[   11.648785] Data abort info:\n[   11.649041]   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000\n[   11.649524]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0\n[   11.649981]   GCS = 0, Overlay = 0, DirtyBit = 0\n[   11.650390] [0000000000000005] user address but active_mm is swapper\n[   11.650955] Internal error: Oops: 0000000096000004 [#1]  SMP\n[   11.651460] Modules linked in:\n[   11.651742] CPU: 1 UID: 0 PID: 144 Comm: kworker/1:2 Not tainted 7.2.0-rc6-g62a9297af2cd #1 PREEMPT\n[   11.652553] Hardware name: Flipper One rev. F0B1C2 (DT)\n[   11.653024] Workqueue: events power_supply_changed_work\n[   11.653511] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)\n[   11.654135] pc : __power_supply_is_supplied_by+0x18/0x100\n[   11.654624] lr : __power_supply_am_i_supplied+0x40/0xb8\n[   11.655098] sp : ffff80008192bb30\n[   11.655399] x29: ffff80008192bb30 x28: 0000000000000000 x27: 0000000000000000\n[   11.656049] x26: 0000000000000000 x25: 0000000000000000 x24: 0000000000000000\n[   11.656695] x23: ffff0000c19f4200 x22: ffffdb2232ba4ea8 x21: ffff80008192bc28\n[   11.657344] x20: ffff0000c1eef000 x19: ffff80008192bc18 x18: 00000000a0886e62\n[   11.657991] x17: 000000040044ffff x16: 04500072b5503510 x15: 0000000000000000\n[   11.658639] x14: 0000000000000000 x13: 0000000000000220 x12: 0000000000000000\n[   11.659286] x11: 0000000000000000 x10: ffff0000c1fdb2b0 x9 : ffffdb2232ba5590\n[   11.659934] x8 : 00000000e5b906e6 x7 : ffff0000c2502778 x6 : ffffdb22339793d0\n[   11.660581] x5 : ffff80008192bc18 x4 : ffff0000c19cbca0 x3 : 0000000000000000\n[   11.661228] x2 : ffff0000c1fdaf40 x1 : ffffffffffffffed x0 : ffff0000c1eef000\n[   11.661878] Call trace:\n[   11.662103]  __power_supply_is_supplied_by+0x18/0x100 (P)\n[   11.662596]  __power_supply_am_i_supplied+0x40/0xb8\n[   11.663040]  psy_for_each_psy_cb+0x20/0x40\n[   11.663416]  class_for_each_device+0x110/0x150\n[   11.663825]  power_supply_am_i_supplied+0x68/0x100\n[   11.664262]  bq257xx_external_power_changed+0x58/0x140\n[   11.664733]  __power_supply_changed_work+0x60/0x80\n[   11.665170]  psy_for_each_psy_cb+0x20/0x40\n[   11.665545]  class_for_each_device+0x110/0x150\n[   11.665953]  power_supply_changed_work+0x98/0x1b8\n[   11.666382]  process_one_work+0x164/0x4c0\n[   11.666758]  worker_thread+0x19c/0x320\n[   11.667104]  kthread+0x138/0x150\n[   11.667408]  ret_from_fork+0x10/0x20\n[   11.667744] Code: d503233f a9bd7bfd 910003fd a90153f3 (f9400c34)\n[   11.668294] ---[ end trace 0000000000000000 ]---\n\nAdd a read-write semaphore between external_power_changed() and\npower_supply_unregister() to prevent the latter from returning (and thus\nthe driver from freeing its data) while the callback is still running."
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-28T10:36:08.618Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/2ac0256a28e15c4888fa394d1fe66cf7b1d58090"
        },
        {
          "url": "https://git.kernel.org/stable/c/45388e50d14bc161873b14b9a05d4b8b8822fca6"
        },
        {
          "url": "https://git.kernel.org/stable/c/5b4bd13e0552926648a46c2c9a12a24dfaee3715"
        }
      ],
      "title": "power: supply: core: prevent unregistering a power supply while a callback runs",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-99215",
    "datePublished": "2026-10-28T10:36:08.618Z",
    "dateReserved": "2026-09-25T10:25:14.401Z",
    "dateUpdated": "2026-10-28T10:36:08.618Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…