crypto: comp - Use same definition of context alloc and free ops

In commit 42d9f6c774 ("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: 42d9f6c774 ("crypto: acomp - Move scomp stream allocation code into acomp")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Dan Moulding
2025-09-08 10:12:43 -06:00
committed by Herbert Xu
parent 381e8ee368
commit f75f66683d
8 changed files with 29 additions and 24 deletions

View 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 = {

View 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 = {

View 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 = {

View 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 = {

View 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 = {

View 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,
};

View 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,
};

View 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;