Commit 54ed0f71 authored by Linus Torvalds's avatar Linus Torvalds

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.
parents 35e60a6b d41519a6
...@@ -68,6 +68,7 @@ ...@@ -68,6 +68,7 @@
static inline u32 rxe_crc32(struct rxe_dev *rxe, static inline u32 rxe_crc32(struct rxe_dev *rxe,
u32 crc, void *next, size_t len) u32 crc, void *next, size_t len)
{ {
u32 retval;
int err; int err;
SHASH_DESC_ON_STACK(shash, rxe->tfm); SHASH_DESC_ON_STACK(shash, rxe->tfm);
...@@ -81,7 +82,9 @@ static inline u32 rxe_crc32(struct rxe_dev *rxe, ...@@ -81,7 +82,9 @@ static inline u32 rxe_crc32(struct rxe_dev *rxe,
return crc32_le(crc, next, len); return crc32_le(crc, next, len);
} }
return *(u32 *)shash_desc_ctx(shash); retval = *(u32 *)shash_desc_ctx(shash);
barrier_data(shash_desc_ctx(shash));
return retval;
} }
int rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu); int rxe_set_mtu(struct rxe_dev *rxe, unsigned int dev_mtu);
......
...@@ -38,6 +38,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length) ...@@ -38,6 +38,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length)
{ {
SHASH_DESC_ON_STACK(shash, tfm); SHASH_DESC_ON_STACK(shash, tfm);
u32 *ctx = (u32 *)shash_desc_ctx(shash); u32 *ctx = (u32 *)shash_desc_ctx(shash);
u32 retval;
int err; int err;
shash->tfm = tfm; shash->tfm = tfm;
...@@ -47,5 +48,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length) ...@@ -47,5 +48,7 @@ u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length)
err = crypto_shash_update(shash, address, length); err = crypto_shash_update(shash, address, length);
BUG_ON(err); BUG_ON(err);
return *ctx; retval = *ctx;
barrier_data(ctx);
return retval;
} }
...@@ -1078,6 +1078,7 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address, ...@@ -1078,6 +1078,7 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address,
{ {
SHASH_DESC_ON_STACK(shash, sbi->s_chksum_driver); SHASH_DESC_ON_STACK(shash, sbi->s_chksum_driver);
u32 *ctx = (u32 *)shash_desc_ctx(shash); u32 *ctx = (u32 *)shash_desc_ctx(shash);
u32 retval;
int err; int err;
shash->tfm = sbi->s_chksum_driver; shash->tfm = sbi->s_chksum_driver;
...@@ -1087,7 +1088,9 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address, ...@@ -1087,7 +1088,9 @@ static inline u32 f2fs_crc32(struct f2fs_sb_info *sbi, const void *address,
err = crypto_shash_update(shash, address, length); err = crypto_shash_update(shash, address, length);
BUG_ON(err); BUG_ON(err);
return *ctx; retval = *ctx;
barrier_data(ctx);
return retval;
} }
static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc, static inline bool f2fs_crc_valid(struct f2fs_sb_info *sbi, __u32 blk_crc,
......
...@@ -43,7 +43,7 @@ static struct crypto_shash *tfm; ...@@ -43,7 +43,7 @@ static struct crypto_shash *tfm;
u32 crc32c(u32 crc, const void *address, unsigned int length) u32 crc32c(u32 crc, const void *address, unsigned int length)
{ {
SHASH_DESC_ON_STACK(shash, tfm); SHASH_DESC_ON_STACK(shash, tfm);
u32 *ctx = (u32 *)shash_desc_ctx(shash); u32 ret, *ctx = (u32 *)shash_desc_ctx(shash);
int err; int err;
shash->tfm = tfm; shash->tfm = tfm;
...@@ -53,7 +53,9 @@ u32 crc32c(u32 crc, const void *address, unsigned int length) ...@@ -53,7 +53,9 @@ u32 crc32c(u32 crc, const void *address, unsigned int length)
err = crypto_shash_update(shash, address, length); err = crypto_shash_update(shash, address, length);
BUG_ON(err); BUG_ON(err);
return *ctx; ret = *ctx;
barrier_data(ctx);
return ret;
} }
EXPORT_SYMBOL(crc32c); EXPORT_SYMBOL(crc32c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment