CVE-2026-46285
Description
Linux kernel use-after-free vulnerability in mtd:docg3 allows local privilege escalation.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Linux kernel use-after-free vulnerability in mtd:docg3 allows local privilege escalation.
Vulnerability
A use-after-free vulnerability exists in the docg3_release() function within the Linux kernel's mtd:docg3 driver. The docg3 pointer is dereferenced after being freed by doc_release_device(), leading to a crash or potential exploitation.
Exploitation
An attacker with local access and the ability to trigger the docg3_release() function could exploit this vulnerability. The vulnerability occurs when doc_release_device() frees the docg3 struct, and subsequently, docg3->cascade->bch attempts to dereference the already freed pointer.
Impact
Successful exploitation of this use-after-free vulnerability could lead to a kernel crash, potentially resulting in a denial of service. In some scenarios, it might also allow for privilege escalation or arbitrary code execution within the kernel context.
Mitigation
This vulnerability has been resolved in the Linux kernel. The fix involves modifying docg3_release() to access cascade->bch directly, avoiding the dereference of the freed docg3 pointer. Users should update to a patched kernel version. No specific version information or patch release date is available in the provided references [1].
AI Insight generated on Jun 8, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
1Patches
16ca19808bc6famtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 33050a2a80f79..603fd0efc2ea2 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
2bf706fe7831mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 8cb25cfd9c10a..2f82bc7c07931 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
d89044889ecdmtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index c93769c233d9a..a46010ea459a3 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
8408655ec834mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index fa42473d04c1b..378239c7513e0 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2042,7 +2042,6 @@ err_probe: static int docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2050,7 +2049,7 @@ static int docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); return 0; } -- cgit 1.3-korg
f5d2ed4ed47dmtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 25a7df6448028..7de576404b14f 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2041,7 +2041,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2049,7 +2048,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
d26f8c361f75mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index a2b643af70194..e37fb11556479 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
16f6588a3b7amtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index a2b643af70194..e37fb11556479 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
d49628d63d4emtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 33050a2a80f79..603fd0efc2ea2 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
d49628d63d4emtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 33050a2a80f79..603fd0efc2ea2 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
ca19808bc6famtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 33050a2a80f79..603fd0efc2ea2 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
2bf706fe7831mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 8cb25cfd9c10a..2f82bc7c07931 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
d89044889ecdmtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index c93769c233d9a..a46010ea459a3 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
f5d2ed4ed47dmtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 25a7df6448028..7de576404b14f 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2041,7 +2041,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2049,7 +2048,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
16f6588a3b7amtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index a2b643af70194..e37fb11556479 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
8408655ec834mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index fa42473d04c1b..378239c7513e0 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2042,7 +2042,6 @@ err_probe: static int docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2050,7 +2049,7 @@ static int docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); return 0; } -- cgit 1.3-korg
d26f8c361f75mtd: docg3: fix use-after-free in docg3_release()
1 file changed · +1 −3
drivers/mtd/devices/docg3.c+1 −3 modifieddiff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index a2b643af70194..e37fb11556479 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c @@ -2049,7 +2049,6 @@ err_probe: static void docg3_release(struct platform_device *pdev) { struct docg3_cascade *cascade = platform_get_drvdata(pdev); - struct docg3 *docg3 = cascade->floors[0]->priv; int floor; doc_unregister_sysfs(pdev, cascade); @@ -2057,7 +2056,7 @@ static void docg3_release(struct platform_device *pdev) if (cascade->floors[floor]) doc_release_device(cascade->floors[floor]); - bch_free(docg3->cascade->bch); + bch_free(cascade->bch); } #ifdef CONFIG_OF -- cgit 1.3-korg
Vulnerability mechanics
Root cause
"The docg3_release function dereferences a pointer after it has been freed."
Attack vector
An attacker can trigger this vulnerability by causing the docg3_release function to execute. This function is responsible for releasing resources associated with the docg3 device. The vulnerability occurs when the `doc_release_device()` function is called within a loop, which frees the `docg3` struct. Subsequently, the code attempts to access members of the now-freed `docg3` struct, leading to a use-after-free condition.
Affected code
The vulnerability exists in the `docg3_release` function within the file `drivers/mtd/devices/docg3.c`. Specifically, the issue arises from the order of operations where `doc_release_device()` is called within a loop, freeing the `docg3` struct, and then `docg3->cascade->bch` is accessed after the loop.
What the fix does
The patch modifies the `docg3_release` function to directly access `cascade->bch` instead of `docg3->cascade->bch` [patch_id=5239489]. This is possible because `docg3->cascade` points to the same `cascade` struct which is already available as a local variable. This change prevents the dereferencing of the `docg3` pointer after it has been freed by `doc_release_device()`, thus resolving the use-after-free vulnerability.
Generated on Jun 8, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
8- git.kernel.org/stable/c/16f6588a3b7a2a20d10ad9b766be74c60ba347ccnvd
- git.kernel.org/stable/c/2bf706fe7831b319f23a85b9728f961cfed40c3envd
- git.kernel.org/stable/c/8408655ec8344511667b61d8257dc59c80ee3391nvd
- git.kernel.org/stable/c/ca19808bc6fac7e29420d8508df569b346b3e339nvd
- git.kernel.org/stable/c/d26f8c361f751c188b7ebaf8189aa0258968fd98nvd
- git.kernel.org/stable/c/d49628d63d4e6bbc8a1621afb88e5fc901611beenvd
- git.kernel.org/stable/c/d89044889ecd11b0c2f86663597246e9bdd25679nvd
- git.kernel.org/stable/c/f5d2ed4ed47d3906e2495a3537a48b127f497a17nvd
News mentions
0No linked articles in our index yet.