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

CVE-2026-45950

CVE-2026-45950

Description

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

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

The starfive_aes_aead_do_one_req() function allocates rctx->adata with kzalloc() but fails to free it if sg_copy_to_buffer() or starfive_aes_hw_init() fails, which lead to memory leaks.

Since rctx->adata is unconditionally freed after the write_adata operations, ensure consistent cleanup by freeing the allocation in these earlier error paths as well.

Compile tested only. Issue found using a prototype static analysis tool and code review.

Affected products

1

Patches

8
ccb679fdae2e

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 29, 2026Fixed in 7.0via kernel-cna
2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
38d80307decc

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 29, 2026Fixed in 6.12.75via kernel-cna
2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 86a1a1fa9f8f9f..04f2f97ce238ad 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -673,8 +673,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     					     "Failed to alloc memory for adata");
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -685,8 +687,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 86a1a1fa9f8f9f..04f2f97ce238ad 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -673,8 +673,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     					     "Failed to alloc memory for adata");
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -685,8 +687,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
4869d0e4e48a

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 29, 2026Fixed in 6.18.14via kernel-cna
2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
5f2c964a0585

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitZilin GuanJan 29, 2026Fixed in 6.19.4via kernel-cna
2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
ccb679fdae2e

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
5f2c964a0585

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
38d80307decc

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 86a1a1fa9f8f9f..04f2f97ce238ad 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -673,8 +673,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     					     "Failed to alloc memory for adata");
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -685,8 +687,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 86a1a1fa9f8f9f..04f2f97ce238ad 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -673,8 +673,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     					     "Failed to alloc memory for adata");
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -685,8 +687,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
4869d0e4e48a

crypto: starfive - Fix memory leak in starfive_aes_aead_do_one_req()

2 files changed · +14 6
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/crypto/starfive/jh7110-aes.c+7 3 modified
    diff --git a/drivers/crypto/starfive/jh7110-aes.c b/drivers/crypto/starfive/jh7110-aes.c
    index 426b24889af853..01195664cc7cd9 100644
    --- a/drivers/crypto/starfive/jh7110-aes.c
    +++ b/drivers/crypto/starfive/jh7110-aes.c
    @@ -669,8 +669,10 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     			return -ENOMEM;
     
     		if (sg_copy_to_buffer(req->src, sg_nents_for_len(req->src, cryp->assoclen),
    -				      rctx->adata, cryp->assoclen) != cryp->assoclen)
    +				      rctx->adata, cryp->assoclen) != cryp->assoclen) {
    +			kfree(rctx->adata);
     			return -EINVAL;
    +		}
     	}
     
     	if (cryp->total_in)
    @@ -681,8 +683,11 @@ static int starfive_aes_aead_do_one_req(struct crypto_engine *engine, void *areq
     	ctx->rctx = rctx;
     
     	ret = starfive_aes_hw_init(ctx);
    -	if (ret)
    +	if (ret) {
    +		if (cryp->assoclen)
    +			kfree(rctx->adata);
     		return ret;
    +	}
     
     	if (!cryp->assoclen)
     		goto write_text;
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing kfree() of rctx->adata in two early error paths inside starfive_aes_aead_do_one_req() leads to a memory leak."

Attack vector

An attacker can trigger the memory leak by submitting an AEAD crypto request that causes either sg_copy_to_buffer() to fail (e.g., by providing a malformed scatter-gather list) or starfive_aes_hw_init() to fail (e.g., by inducing a hardware initialization error). In both cases the function returns an error code without freeing the previously kzalloc()'d rctx->adata buffer, leaking the allocated memory [patch_id=2661065]. The leak is in the StarFive JH7110 AES driver's AEAD request handler in drivers/crypto/starfive/jh7110-aes.c.

Affected code

The vulnerable function is starfive_aes_aead_do_one_req() in drivers/crypto/starfive/jh7110-aes.c [patch_id=2661065]. The two error paths that lacked cleanup are: (1) after sg_copy_to_buffer() fails (line ~672), and (2) after starfive_aes_hw_init() fails (line ~683).

What the fix does

The patch adds kfree(rctx->adata) before the return -EINVAL when sg_copy_to_buffer() fails, and adds a conditional kfree(rctx->adata) (guarded by cryp->assoclen) before the return ret when starfive_aes_hw_init() fails [patch_id=2661065]. This ensures the allocation is freed on all error paths, matching the existing cleanup that occurs unconditionally after the write_adata operations. The fix is consistent with the principle that every kzalloc() must have a corresponding kfree() on every exit path.

Preconditions

  • configThe system must have the StarFive JH7110 AES crypto driver loaded and in use.
  • inputAn attacker must be able to submit AEAD crypto requests to the kernel crypto subsystem.

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

References

4

News mentions

0

No linked articles in our index yet.