mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
crypto: comp - Use same definition of context alloc and free ops
In commit42d9f6c774("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:
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user