diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-15 04:54:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-15 04:54:51 -0400 |
commit | 54ed0f71f0a0cbf3218e2503a50364f178b1e855 (patch) | |
tree | 6bb2b4a205bbc208311fbf46e9ed02eb05357a17 | |
parent | 35e60a6b7577218ac7eb7777c8849822a080e127 (diff) | |
parent | d41519a69b35b10af7fda867fb9100df24fdf403 (diff) |
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fix from Herbert Xu:
"This fixes a bug on sparc where we may dereference freed stack memory"
* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
crypto: Work around deallocated stack frame reference gcc bug on sparc.
-rw-r--r-- | drivers/infiniband/sw/rxe/rxe.h | 5 | ||||
-rw-r--r-- | fs/btrfs/hash.c | 5 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 5 | ||||
-rw-r--r-- | lib/libcrc32c.c | 6 |
4 files changed, 16 insertions, 5 deletions
diff --git a/drivers/infiniband/sw/rxe/rxe.h b/drivers/infiniband/sw/rxe/rxe.h index ecdba2fce083..1ac5b8551a4d 100644 --- a/drivers/infiniband/sw/rxe/rxe.h +++ b/drivers/infiniband/sw/rxe/rxe.h | |||
@@ -68,6 +68,7 @@ | |||
68 | static inline u32 rxe_crc32(struct rxe_dev *rxe, | 68 | static inline u32 rxe_crc32(struct rxe_dev *rxe, |
69 | u32 crc, void *next, size_t len) | 69 | u32 crc, void *next, size_t len) |
70 | { | 70 | { |
71 | u32 retval; | ||
71 | int err; | 72 | int err; |
72 | 73 | ||
73 | SHASH_DESC_ON_STACK(shash, rxe->tfm); | 74 | SHASH_DESC_ON_STACK(shash, rxe->tfm); |
@@ -81,7 +82,9 @@ static inline u32 rxe_crc32(struct rxe_dev *rxe, | |||
81 | return crc32_le(crc, next, len); | 82 | return crc32_le(crc, next, len); |
82 | } | 83 | } |
83 | 84 | ||
84 | return *(u32 *)shash_desc_ctx(shash); | 85 | retval = *(u32 *)shash_desc_ctx(shash); |
86 | barrier_data(shash_desc_ctx(shash)); | ||
87 | return retval; | ||
85 | } | 88 | } |
86 | 89 | ||
87 | int rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu); | 90 | int rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu); |
diff --git a/fs/btrfs/hash.c b/fs/btrfs/hash.c index a97fdc156a03..baacc1866861 100644 --- a/fs/btrfs/hash.c +++ b/fs/btrfs/hash.c | |||
@@ -38,6 +38,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length) | |||
38 | { | 38 | { |
39 | SHASH_DESC_ON_STACK(shash, tfm); | 39 | SHASH_DESC_ON_STACK(shash, tfm); |
40 | u32 *ctx = (u32 *)shash_desc_ctx(shash); | 40 | u32 *ctx = (u32 *)shash_desc_ctx(shash); |
41 | u32 retval; | ||
41 | int err; | 42 | int err; |
42 | 43 | ||
43 | shash->tfm = tfm; | 44 | shash->tfm = tfm; |
@@ -47,5 +48,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length) | |||
47 | err = crypto_shash_update(shash, address, length); | 48 | err = crypto_shash_update(shash, address, length); |
48 | BUG_ON(err); | 49 | BUG_ON(err); |
49 | 50 | ||
50 | return *ctx; | 51 | retval = *ctx; |
52 | barrier_data(ctx); | ||
53 | return retval; | ||
51 | } | 54 | } |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 2185c7a040a1..fd2e651bad6d 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -1078,6 +1078,7 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address, | |||
1078 | { | 1078 | { |
1079 | SHASH_DESC_ON_STACK(shash, sbi->s_chksum_driver); | 1079 | SHASH_DESC_ON_STACK(shash, sbi->s_chksum_driver); |
1080 | u32 *ctx = (u32 *)shash_desc_ctx(shash); | 1080 | u32 *ctx = (u32 *)shash_desc_ctx(shash); |
1081 | u32 retval; | ||
1081 | int err; | 1082 | int err; |
1082 | 1083 | ||
1083 | shash->tfm = sbi->s_chksum_driver; | 1084 | shash->tfm = sbi->s_chksum_driver; |
@@ -1087,7 +1088,9 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address, | |||
1087 | err = crypto_shash_update(shash, address, length); | 1088 | err = crypto_shash_update(shash, address, length); |
1088 | BUG_ON(err); | 1089 | BUG_ON(err); |
1089 | 1090 | ||
1090 | return *ctx; | 1091 | retval = *ctx; |
1092 | barrier_data(ctx); | ||
1093 | return retval; | ||
1091 | } | 1094 | } |
1092 | 1095 | ||
1093 | static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc, | 1096 | static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc, |
diff --git a/lib/libcrc32c.c b/lib/libcrc32c.c index 74a54b7f2562..9f79547d1b97 100644 --- a/lib/libcrc32c.c +++ b/lib/libcrc32c.c | |||
@@ -43,7 +43,7 @@ static struct crypto_shash *tfm; | |||
43 | u32 crc32c(u32 crc, const void *address, unsigned int length) | 43 | u32 crc32c(u32 crc, const void *address, unsigned int length) |
44 | { | 44 | { |
45 | SHASH_DESC_ON_STACK(shash, tfm); | 45 | SHASH_DESC_ON_STACK(shash, tfm); |
46 | u32 *ctx = (u32 *)shash_desc_ctx(shash); | 46 | u32 ret, *ctx = (u32 *)shash_desc_ctx(shash); |
47 | int err; | 47 | int err; |
48 | 48 | ||
49 | shash->tfm = tfm; | 49 | shash->tfm = tfm; |
@@ -53,7 +53,9 @@ u32 crc32c(u32 crc, const void *address, unsigned int length) | |||
53 | err = crypto_shash_update(shash, address, length); | 53 | err = crypto_shash_update(shash, address, length); |
54 | BUG_ON(err); | 54 | BUG_ON(err); |
55 | 55 | ||
56 | return *ctx; | 56 | ret = *ctx; |
57 | barrier_data(ctx); | ||
58 | return ret; | ||
57 | } | 59 | } |
58 | 60 | ||
59 | EXPORT_SYMBOL(crc32c); | 61 | EXPORT_SYMBOL(crc32c); |