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

CVE-2026-45896

CVE-2026-45896

Description

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

mtd: intel-dg: Fix accessing regions before setting nregions

The regions array is counted by nregions, but it's set only after accessing it:

[] UBSAN: array-index-out-of-bounds in drivers/mtd/devices/mtd_intel_dg.c:750:15 [] index 0 is out of range for type ' [*]'

Fix it by also fixing an undesired behavior: the loop silently ignores ENOMEM and continues setting the other entries.

Affected products

1

Patches

6
721bd22bcf45

mtd: intel-dg: Fix accessing regions before setting nregions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitAlexander UsyskinJan 15, 2026Fixed in 6.18.14via kernel-cna
2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index b438ee5aacc34a..114e69135b8d93 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -738,6 +738,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -745,13 +746,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	nvm->base = devm_ioremap_resource(device, &invm->bar);
     	if (IS_ERR(nvm->base)) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index b438ee5aacc34a..114e69135b8d93 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -738,6 +738,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -745,13 +746,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	nvm->base = devm_ioremap_resource(device, &invm->bar);
     	if (IS_ERR(nvm->base)) {
    -- 
    cgit 1.3-korg
    
    
    
d58fca851341

mtd: intel-dg: Fix accessing regions before setting nregions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitAlexander UsyskinJan 15, 2026Fixed in 6.19.4via kernel-cna
2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
779c59274d03

mtd: intel-dg: Fix accessing regions before setting nregions

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitAlexander UsyskinJan 15, 2026Fixed in 7.0via kernel-cna
2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
721bd22bcf45

mtd: intel-dg: Fix accessing regions before setting nregions

2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index b438ee5aacc34a..114e69135b8d93 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -738,6 +738,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -745,13 +746,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	nvm->base = devm_ioremap_resource(device, &invm->bar);
     	if (IS_ERR(nvm->base)) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index b438ee5aacc34a..114e69135b8d93 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -738,6 +738,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -745,13 +746,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	nvm->base = devm_ioremap_resource(device, &invm->bar);
     	if (IS_ERR(nvm->base)) {
    -- 
    cgit 1.3-korg
    
    
    
779c59274d03

mtd: intel-dg: Fix accessing regions before setting nregions

2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
d58fca851341

mtd: intel-dg: Fix accessing regions before setting nregions

2 files changed · +12 8
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/mtd/devices/mtd_intel_dg.c+6 4 modified
    diff --git a/drivers/mtd/devices/mtd_intel_dg.c b/drivers/mtd/devices/mtd_intel_dg.c
    index 2bab30dcd35fd0..7f751c48a76d4c 100644
    --- a/drivers/mtd/devices/mtd_intel_dg.c
    +++ b/drivers/mtd/devices/mtd_intel_dg.c
    @@ -770,6 +770,7 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     	kref_init(&nvm->refcnt);
     	mutex_init(&nvm->lock);
    +	nvm->nregions = nregions;
     
     	for (n = 0, i = 0; i < INTEL_DG_NVM_REGIONS; i++) {
     		if (!invm->regions[i].name)
    @@ -777,13 +778,15 @@ static int intel_dg_mtd_probe(struct auxiliary_device *aux_dev,
     
     		char *name = kasprintf(GFP_KERNEL, "%s.%s",
     				       dev_name(&aux_dev->dev), invm->regions[i].name);
    -		if (!name)
    -			continue;
    +		if (!name) {
    +			ret = -ENOMEM;
    +			goto err;
    +		}
    +
     		nvm->regions[n].name = name;
     		nvm->regions[n].id = i;
     		n++;
     	}
    -	nvm->nregions = n; /* in case where kasprintf fail */
     
     	ret = devm_pm_runtime_enable(device);
     	if (ret < 0) {
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Use of `nvm->nregions` before it is initialized, because the assignment was placed after the loop that populates the regions array."

Attack vector

An attacker does not directly trigger this bug; it manifests during driver probe when the kernel module loads for an Intel graphics NVM device. The `intel_dg_mtd_probe()` function initializes `nvm->nregions` only after populating the `nvm->regions[]` array. Any kernel code path that reads `nvm->nregions` between those two points sees an uninitialized value (zero), causing UBSAN to report an array-index-out-of-bounds at line 750 of `mtd_intel_dg.c`. The precondition is simply that the driver probes on affected hardware.

Affected code

The bug is in the `intel_dg_mtd_probe()` function in `drivers/mtd/devices/mtd_intel_dg.c`. The `nvm->nregions` field was assigned *after* the loop that populates `nvm->regions[]`, meaning any code that reads `nvm->nregions` between the loop and the assignment would see an uninitialized (zero) value. The UBSAN report points to line 750, where an array-index-out-of-bounds was triggered because `nregions` was still zero when the regions array was accessed.

What the fix does

The patch makes two changes. First, it moves the `nvm->nregions = nregions` assignment to *before* the loop, so the field is correctly initialized before any code reads it. Second, it changes the `kasprintf()` failure path from a silent `continue` (which left the loop running and ignored the ENOMEM) to a `goto err` that propagates the `-ENOMEM` error and aborts probe. This closes the out-of-bounds access and also ensures memory allocation failures are properly handled rather than silently skipped.

Preconditions

  • configThe kernel must have the intel-dg MTD driver built and loaded for an Intel graphics NVM device.
  • authNo authentication or special privileges required; the bug triggers during normal driver probe.

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

References

3

News mentions

0

No linked articles in our index yet.