Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

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>

authored by

Dan Moulding and committed by
Herbert Xu
f75f6668 381e8ee3

+29 -24
+4 -2
crypto/842.c
··· 54 54 } 55 55 56 56 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 + }, 59 61 .compress = crypto842_scompress, 60 62 .decompress = crypto842_sdecompress, 61 63 .base = {
+4 -2
crypto/lz4.c
··· 68 68 } 69 69 70 70 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 + }, 73 75 .compress = lz4_scompress, 74 76 .decompress = lz4_sdecompress, 75 77 .base = {
+4 -2
crypto/lz4hc.c
··· 66 66 } 67 67 68 68 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 + }, 71 73 .compress = lz4hc_scompress, 72 74 .decompress = lz4hc_sdecompress, 73 75 .base = {
+4 -2
crypto/lzo-rle.c
··· 70 70 } 71 71 72 72 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 + }, 75 77 .compress = lzorle_scompress, 76 78 .decompress = lzorle_sdecompress, 77 79 .base = {
+4 -2
crypto/lzo.c
··· 70 70 } 71 71 72 72 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 + }, 75 77 .compress = lzo_scompress, 76 78 .decompress = lzo_sdecompress, 77 79 .base = {
+4 -2
drivers/crypto/nx/nx-common-powernv.c
··· 1043 1043 .base.cra_priority = 300, 1044 1044 .base.cra_module = THIS_MODULE, 1045 1045 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 + }, 1048 1050 .compress = nx842_crypto_compress, 1049 1051 .decompress = nx842_crypto_decompress, 1050 1052 };
+4 -2
drivers/crypto/nx/nx-common-pseries.c
··· 1020 1020 .base.cra_priority = 300, 1021 1021 .base.cra_module = THIS_MODULE, 1022 1022 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 + }, 1025 1027 .compress = nx842_crypto_compress, 1026 1028 .decompress = nx842_crypto_decompress, 1027 1029 };
+1 -10
include/crypto/internal/scompress.h
··· 18 18 /** 19 19 * struct scomp_alg - synchronous compression algorithm 20 20 * 21 - * @alloc_ctx: Function allocates algorithm specific context 22 - * @free_ctx: Function frees context allocated with alloc_ctx 23 21 * @compress: Function performs a compress operation 24 22 * @decompress: Function performs a de-compress operation 25 - * @base: Common crypto API algorithm data structure 26 23 * @streams: Per-cpu memory for algorithm 27 24 * @calg: Cmonn algorithm data structure shared with acomp 28 25 */ ··· 31 34 unsigned int slen, u8 *dst, unsigned int *dlen, 32 35 void *ctx); 33 36 34 - union { 35 - struct { 36 - void *(*alloc_ctx)(void); 37 - void (*free_ctx)(void *ctx); 38 - }; 39 - struct crypto_acomp_streams streams; 40 - }; 37 + struct crypto_acomp_streams streams; 41 38 42 39 union { 43 40 struct COMP_ALG_COMMON;