]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: comp - Use same definition of context alloc and free ops
authorDan Moulding <dan@danm.net>
Mon, 8 Sep 2025 16:12:43 +0000 (10:12 -0600)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 20 Sep 2025 12:21:03 +0000 (20:21 +0800)
In commit 42d9f6c77479 ("crypto: acomp - Move scomp stream allocation
code into acomp"), the crypto_acomp_streams struct was made to rely on
having the alloc_ctx and free_ctx operations defined in the same order
as the scomp_alg struct. But in that same commit, the alloc_ctx and
free_ctx members of scomp_alg may be randomized by structure layout
randomization, since they are contained in a pure ops structure
(containing only function pointers). If the pointers within scomp_alg
are randomized, but those in crypto_acomp_streams are not, then
the order may no longer match. This fixes the problem by removing the
union from scomp_alg so that both crypto_acomp_streams and scomp_alg
will share the same definition of alloc_ctx and free_ctx, ensuring
they will always have the same layout.

Signed-off-by: Dan Moulding <dan@danm.net>
Suggested-by: Herbert Xu <herbert@gondor.apana.org.au>
Fixes: 42d9f6c77479 ("crypto: acomp - Move scomp stream allocation code into acomp")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/842.c
crypto/lz4.c
crypto/lz4hc.c
crypto/lzo-rle.c
crypto/lzo.c
drivers/crypto/nx/nx-common-powernv.c
drivers/crypto/nx/nx-common-pseries.c
include/crypto/internal/scompress.h

index 8c257c40e2b901732dafd042ed2ac1a32a3f5ee0..4007e87bed806d598aec0ce140c1d0487b35cde6 100644 (file)
@@ -54,8 +54,10 @@ static int crypto842_sdecompress(struct crypto_scomp *tfm,
 }
 
 static struct scomp_alg scomp = {
-       .alloc_ctx              = crypto842_alloc_ctx,
-       .free_ctx               = crypto842_free_ctx,
+       .streams                = {
+               .alloc_ctx      = crypto842_alloc_ctx,
+               .free_ctx       = crypto842_free_ctx,
+       },
        .compress               = crypto842_scompress,
        .decompress             = crypto842_sdecompress,
        .base                   = {
index 7a984ae5ae52ea3d6d44bdf780c3affd6697abea..57b713516aefac823f2af9481c828027b42490dd 100644 (file)
@@ -68,8 +68,10 @@ static int lz4_sdecompress(struct crypto_scomp *tfm, const u8 *src,
 }
 
 static struct scomp_alg scomp = {
-       .alloc_ctx              = lz4_alloc_ctx,
-       .free_ctx               = lz4_free_ctx,
+       .streams                = {
+               .alloc_ctx      = lz4_alloc_ctx,
+               .free_ctx       = lz4_free_ctx,
+       },
        .compress               = lz4_scompress,
        .decompress             = lz4_sdecompress,
        .base                   = {
index 9c61d05b621429e8e7af3ff94909079c500d7383..bb84f8a68cb58f89e252d3d06237535eedac16cd 100644 (file)
@@ -66,8 +66,10 @@ static int lz4hc_sdecompress(struct crypto_scomp *tfm, const u8 *src,
 }
 
 static struct scomp_alg scomp = {
-       .alloc_ctx              = lz4hc_alloc_ctx,
-       .free_ctx               = lz4hc_free_ctx,
+       .streams                = {
+               .alloc_ctx      = lz4hc_alloc_ctx,
+               .free_ctx       = lz4hc_free_ctx,
+       },
        .compress               = lz4hc_scompress,
        .decompress             = lz4hc_sdecompress,
        .base                   = {
index ba013f2d5090d534fcb00d04777764bcaf052906..794e7ec49536b0694838bdf02972ee70ab46756e 100644 (file)
@@ -70,8 +70,10 @@ static int lzorle_sdecompress(struct crypto_scomp *tfm, const u8 *src,
 }
 
 static struct scomp_alg scomp = {
-       .alloc_ctx              = lzorle_alloc_ctx,
-       .free_ctx               = lzorle_free_ctx,
+       .streams                = {
+               .alloc_ctx      = lzorle_alloc_ctx,
+               .free_ctx       = lzorle_free_ctx,
+       },
        .compress               = lzorle_scompress,
        .decompress             = lzorle_sdecompress,
        .base                   = {
index 7867e2c67c4ed1307addbf16c518bec223994bea..d43242b24b4e831e7e0d26f38d2f263877d5748e 100644 (file)
@@ -70,8 +70,10 @@ static int lzo_sdecompress(struct crypto_scomp *tfm, const u8 *src,
 }
 
 static struct scomp_alg scomp = {
-       .alloc_ctx              = lzo_alloc_ctx,
-       .free_ctx               = lzo_free_ctx,
+       .streams                = {
+               .alloc_ctx      = lzo_alloc_ctx,
+               .free_ctx       = lzo_free_ctx,
+       },
        .compress               = lzo_scompress,
        .decompress             = lzo_sdecompress,
        .base                   = {
index fd0a98b2fb1b250139dde5e5eb359113b9c35f00..0493041ea08851725eb67f9e2fbfe0fb8e34c9ad 100644 (file)
@@ -1043,8 +1043,10 @@ static struct scomp_alg nx842_powernv_alg = {
        .base.cra_priority      = 300,
        .base.cra_module        = THIS_MODULE,
 
-       .alloc_ctx              = nx842_powernv_crypto_alloc_ctx,
-       .free_ctx               = nx842_crypto_free_ctx,
+       .streams                = {
+               .alloc_ctx      = nx842_powernv_crypto_alloc_ctx,
+               .free_ctx       = nx842_crypto_free_ctx,
+       },
        .compress               = nx842_crypto_compress,
        .decompress             = nx842_crypto_decompress,
 };
index f528e072494a2eacb6c2f5bbceec447d0b718f4b..fc0222ebe807213924dd8dda6615e6827f92fb6e 100644 (file)
@@ -1020,8 +1020,10 @@ static struct scomp_alg nx842_pseries_alg = {
        .base.cra_priority      = 300,
        .base.cra_module        = THIS_MODULE,
 
-       .alloc_ctx              = nx842_pseries_crypto_alloc_ctx,
-       .free_ctx               = nx842_crypto_free_ctx,
+       .streams                = {
+               .alloc_ctx      = nx842_pseries_crypto_alloc_ctx,
+               .free_ctx       = nx842_crypto_free_ctx,
+       },
        .compress               = nx842_crypto_compress,
        .decompress             = nx842_crypto_decompress,
 };
index 533d6c16a49145fee2bbc89a0147fa5be32c2b2e..6a2c5f2e90f954153797582fb0c383783690b7a9 100644 (file)
@@ -18,11 +18,8 @@ struct crypto_scomp {
 /**
  * struct scomp_alg - synchronous compression algorithm
  *
- * @alloc_ctx: Function allocates algorithm specific context
- * @free_ctx:  Function frees context allocated with alloc_ctx
  * @compress:  Function performs a compress operation
  * @decompress:        Function performs a de-compress operation
- * @base:      Common crypto API algorithm data structure
  * @streams:   Per-cpu memory for algorithm
  * @calg:      Cmonn algorithm data structure shared with acomp
  */
@@ -34,13 +31,7 @@ struct scomp_alg {
                          unsigned int slen, u8 *dst, unsigned int *dlen,
                          void *ctx);
 
-       union {
-               struct {
-                       void *(*alloc_ctx)(void);
-                       void (*free_ctx)(void *ctx);
-               };
-               struct crypto_acomp_streams streams;
-       };
+       struct crypto_acomp_streams streams;
 
        union {
                struct COMP_ALG_COMMON;