Skip to content

Commit f75f666

Browse files
dmouldingherbertx
authored andcommitted
crypto: comp - Use same definition of context alloc and free ops
In commit 42d9f6c ("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: 42d9f6c ("crypto: acomp - Move scomp stream allocation code into acomp") Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 381e8ee commit f75f666

8 files changed

Lines changed: 29 additions & 24 deletions

File tree

crypto/842.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ static int crypto842_sdecompress(struct crypto_scomp *tfm,
5454
}
5555

5656
static struct scomp_alg scomp = {
57-
.alloc_ctx = crypto842_alloc_ctx,
58-
.free_ctx = crypto842_free_ctx,
57+
.streams = {
58+
.alloc_ctx = crypto842_alloc_ctx,
59+
.free_ctx = crypto842_free_ctx,
60+
},
5961
.compress = crypto842_scompress,
6062
.decompress = crypto842_sdecompress,
6163
.base = {

crypto/lz4.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ static int lz4_sdecompress(struct crypto_scomp *tfm, const u8 *src,
6868
}
6969

7070
static struct scomp_alg scomp = {
71-
.alloc_ctx = lz4_alloc_ctx,
72-
.free_ctx = lz4_free_ctx,
71+
.streams = {
72+
.alloc_ctx = lz4_alloc_ctx,
73+
.free_ctx = lz4_free_ctx,
74+
},
7375
.compress = lz4_scompress,
7476
.decompress = lz4_sdecompress,
7577
.base = {

crypto/lz4hc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ static int lz4hc_sdecompress(struct crypto_scomp *tfm, const u8 *src,
6666
}
6767

6868
static struct scomp_alg scomp = {
69-
.alloc_ctx = lz4hc_alloc_ctx,
70-
.free_ctx = lz4hc_free_ctx,
69+
.streams = {
70+
.alloc_ctx = lz4hc_alloc_ctx,
71+
.free_ctx = lz4hc_free_ctx,
72+
},
7173
.compress = lz4hc_scompress,
7274
.decompress = lz4hc_sdecompress,
7375
.base = {

crypto/lzo-rle.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ static int lzorle_sdecompress(struct crypto_scomp *tfm, const u8 *src,
7070
}
7171

7272
static struct scomp_alg scomp = {
73-
.alloc_ctx = lzorle_alloc_ctx,
74-
.free_ctx = lzorle_free_ctx,
73+
.streams = {
74+
.alloc_ctx = lzorle_alloc_ctx,
75+
.free_ctx = lzorle_free_ctx,
76+
},
7577
.compress = lzorle_scompress,
7678
.decompress = lzorle_sdecompress,
7779
.base = {

crypto/lzo.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ static int lzo_sdecompress(struct crypto_scomp *tfm, const u8 *src,
7070
}
7171

7272
static struct scomp_alg scomp = {
73-
.alloc_ctx = lzo_alloc_ctx,
74-
.free_ctx = lzo_free_ctx,
73+
.streams = {
74+
.alloc_ctx = lzo_alloc_ctx,
75+
.free_ctx = lzo_free_ctx,
76+
},
7577
.compress = lzo_scompress,
7678
.decompress = lzo_sdecompress,
7779
.base = {

drivers/crypto/nx/nx-common-powernv.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,8 +1043,10 @@ static struct scomp_alg nx842_powernv_alg = {
10431043
.base.cra_priority = 300,
10441044
.base.cra_module = THIS_MODULE,
10451045

1046-
.alloc_ctx = nx842_powernv_crypto_alloc_ctx,
1047-
.free_ctx = nx842_crypto_free_ctx,
1046+
.streams = {
1047+
.alloc_ctx = nx842_powernv_crypto_alloc_ctx,
1048+
.free_ctx = nx842_crypto_free_ctx,
1049+
},
10481050
.compress = nx842_crypto_compress,
10491051
.decompress = nx842_crypto_decompress,
10501052
};

drivers/crypto/nx/nx-common-pseries.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,8 +1020,10 @@ static struct scomp_alg nx842_pseries_alg = {
10201020
.base.cra_priority = 300,
10211021
.base.cra_module = THIS_MODULE,
10221022

1023-
.alloc_ctx = nx842_pseries_crypto_alloc_ctx,
1024-
.free_ctx = nx842_crypto_free_ctx,
1023+
.streams = {
1024+
.alloc_ctx = nx842_pseries_crypto_alloc_ctx,
1025+
.free_ctx = nx842_crypto_free_ctx,
1026+
},
10251027
.compress = nx842_crypto_compress,
10261028
.decompress = nx842_crypto_decompress,
10271029
};

include/crypto/internal/scompress.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@ struct crypto_scomp {
1818
/**
1919
* struct scomp_alg - synchronous compression algorithm
2020
*
21-
* @alloc_ctx: Function allocates algorithm specific context
22-
* @free_ctx: Function frees context allocated with alloc_ctx
2321
* @compress: Function performs a compress operation
2422
* @decompress: Function performs a de-compress operation
25-
* @base: Common crypto API algorithm data structure
2623
* @streams: Per-cpu memory for algorithm
2724
* @calg: Cmonn algorithm data structure shared with acomp
2825
*/
@@ -34,13 +31,7 @@ struct scomp_alg {
3431
unsigned int slen, u8 *dst, unsigned int *dlen,
3532
void *ctx);
3633

37-
union {
38-
struct {
39-
void *(*alloc_ctx)(void);
40-
void (*free_ctx)(void *ctx);
41-
};
42-
struct crypto_acomp_streams streams;
43-
};
34+
struct crypto_acomp_streams streams;
4435

4536
union {
4637
struct COMP_ALG_COMMON;

0 commit comments

Comments
 (0)