]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: af-alg - fix NULL pointer dereference in scatterwalk
authorNorbert Szetei <norbert@doyensec.com>
Wed, 25 Mar 2026 17:26:13 +0000 (18:26 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 26 Mar 2026 09:10:58 +0000 (18:10 +0900)
The AF_ALG interface fails to unmark the end of a Scatter/Gather List (SGL)
when chaining a new af_alg_tsgl structure. If a sendmsg() fills an SGL
exactly to MAX_SGL_ENTS, the last entry is marked as the end. A subsequent
sendmsg() allocates a new SGL and chains it, but fails to clear the end
marker on the previous SGL's last data entry.

This causes the crypto scatterwalk to hit a premature end, returning NULL
on sg_next() and leading to a kernel panic during dereference.

Fix this by explicitly unmarking the end of the previous SGL when
performing sg_chain() in af_alg_alloc_tsgl().

Fixes: 8ff590903d5f ("crypto: algif_skcipher - User-space interface for skcipher operations")
Signed-off-by: Norbert Szetei <norbert@doyensec.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/af_alg.c

index 0bb609fbec7d9e3338053057baf0baf2122a6993..c2fd9cd86c5efac0bbb57a718172640bca0fc6fb 100644 (file)
@@ -623,8 +623,10 @@ static int af_alg_alloc_tsgl(struct sock *sk)
                sg_init_table(sgl->sg, MAX_SGL_ENTS + 1);
                sgl->cur = 0;
 
-               if (sg)
+               if (sg) {
+                       sg_unmark_end(sg + MAX_SGL_ENTS - 1);
                        sg_chain(sg, MAX_SGL_ENTS + 1, sgl->sg);
+               }
 
                list_add_tail(&sgl->list, &ctx->tsgl_list);
        }