]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: ccree - Correctly handle return of sg_nents_for_len
authorHaotian Zhang <vulab@iscas.ac.cn>
Mon, 10 Nov 2025 07:20:41 +0000 (15:20 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 22 Nov 2025 02:04:50 +0000 (10:04 +0800)
Fix error handling in cc_map_hash_request_update where sg_nents_for_len
return value was assigned to u32, converting negative errors to large
positive values before passing to sg_copy_to_buffer.

Check sg_nents_for_len return value and propagate errors before
assigning to areq_ctx->in_nents.

Fixes: b7ec8530687a ("crypto: ccree - use std api when possible")
Signed-off-by: Haotian Zhang <vulab@iscas.ac.cn>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccree/cc_buffer_mgr.c

index 3963bb91321fc130a0912670376720a575a0c070..dc7e0cd51c259655ea3ce44c69bf540bb8db91d4 100644 (file)
@@ -1235,6 +1235,7 @@ int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
        int rc = 0;
        u32 dummy = 0;
        u32 mapped_nents = 0;
+       int sg_nents;
 
        dev_dbg(dev, " update params : curr_buff=%p curr_buff_cnt=0x%X nbytes=0x%X src=%p curr_index=%u\n",
                curr_buff, *curr_buff_cnt, nbytes, src, areq_ctx->buff_index);
@@ -1248,7 +1249,10 @@ int cc_map_hash_request_update(struct cc_drvdata *drvdata, void *ctx,
        if (total_in_len < block_size) {
                dev_dbg(dev, " less than one block: curr_buff=%p *curr_buff_cnt=0x%X copy_to=%p\n",
                        curr_buff, *curr_buff_cnt, &curr_buff[*curr_buff_cnt]);
-               areq_ctx->in_nents = sg_nents_for_len(src, nbytes);
+               sg_nents = sg_nents_for_len(src, nbytes);
+               if (sg_nents < 0)
+                       return sg_nents;
+               areq_ctx->in_nents = sg_nents;
                sg_copy_to_buffer(src, areq_ctx->in_nents,
                                  &curr_buff[*curr_buff_cnt], nbytes);
                *curr_buff_cnt += nbytes;