VYPR
Unrated severityNVD Advisory· Published Nov 18, 2019· Updated Aug 5, 2024

CVE-2019-19067

CVE-2019-19067

Description

Four memory leaks in the acp_hw_init() function in drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c in the Linux kernel before 5.3.8 allow attackers to cause a denial of service (memory consumption) by triggering mfd_add_hotplug_devices() or pm_genpd_add_device() failures, aka CID-57be09c6e874. NOTE: third parties dispute the relevance of this because the attacker must already have privileges for module loading

Affected products

88

Patches

1
57be09c6e874

drm/amdgpu: fix multiple memory leaks in acp_hw_init

https://github.com/torvalds/linuxNavid EmamdoostOct 2, 2019via osv
1 file changed · +22 12
  • drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c+22 12 modified
    @@ -189,7 +189,7 @@ static int acp_hw_init(void *handle)
     	u32 val = 0;
     	u32 count = 0;
     	struct device *dev;
    -	struct i2s_platform_data *i2s_pdata;
    +	struct i2s_platform_data *i2s_pdata = NULL;
     
     	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
     
    @@ -231,20 +231,21 @@ static int acp_hw_init(void *handle)
     	adev->acp.acp_cell = kcalloc(ACP_DEVS, sizeof(struct mfd_cell),
     							GFP_KERNEL);
     
    -	if (adev->acp.acp_cell == NULL)
    -		return -ENOMEM;
    +	if (adev->acp.acp_cell == NULL) {
    +		r = -ENOMEM;
    +		goto failure;
    +	}
     
     	adev->acp.acp_res = kcalloc(5, sizeof(struct resource), GFP_KERNEL);
     	if (adev->acp.acp_res == NULL) {
    -		kfree(adev->acp.acp_cell);
    -		return -ENOMEM;
    +		r = -ENOMEM;
    +		goto failure;
     	}
     
     	i2s_pdata = kcalloc(3, sizeof(struct i2s_platform_data), GFP_KERNEL);
     	if (i2s_pdata == NULL) {
    -		kfree(adev->acp.acp_res);
    -		kfree(adev->acp.acp_cell);
    -		return -ENOMEM;
    +		r = -ENOMEM;
    +		goto failure;
     	}
     
     	switch (adev->asic_type) {
    @@ -341,14 +342,14 @@ static int acp_hw_init(void *handle)
     	r = mfd_add_hotplug_devices(adev->acp.parent, adev->acp.acp_cell,
     								ACP_DEVS);
     	if (r)
    -		return r;
    +		goto failure;
     
     	for (i = 0; i < ACP_DEVS ; i++) {
     		dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i);
     		r = pm_genpd_add_device(&adev->acp.acp_genpd->gpd, dev);
     		if (r) {
     			dev_err(dev, "Failed to add dev to genpd\n");
    -			return r;
    +			goto failure;
     		}
     	}
     
    @@ -367,7 +368,8 @@ static int acp_hw_init(void *handle)
     			break;
     		if (--count == 0) {
     			dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
    -			return -ETIMEDOUT;
    +			r = -ETIMEDOUT;
    +			goto failure;
     		}
     		udelay(100);
     	}
    @@ -384,7 +386,8 @@ static int acp_hw_init(void *handle)
     			break;
     		if (--count == 0) {
     			dev_err(&adev->pdev->dev, "Failed to reset ACP\n");
    -			return -ETIMEDOUT;
    +			r = -ETIMEDOUT;
    +			goto failure;
     		}
     		udelay(100);
     	}
    @@ -393,6 +396,13 @@ static int acp_hw_init(void *handle)
     	val &= ~ACP_SOFT_RESET__SoftResetAud_MASK;
     	cgs_write_register(adev->acp.cgs_device, mmACP_SOFT_RESET, val);
     	return 0;
    +
    +failure:
    +	kfree(i2s_pdata);
    +	kfree(adev->acp.acp_res);
    +	kfree(adev->acp.acp_cell);
    +	kfree(adev->acp.acp_genpd);
    +	return r;
     }
     
     /**
    

Vulnerability mechanics

Generated on May 9, 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.