diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-11 12:23:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-11 12:23:07 -0500 |
commit | 65d57b3050eed3d848e51761904668b5d156743c (patch) | |
tree | 3445d4ea3d11415cf570e56d5dbd74c5578836de /crypto | |
parent | c8fff3ed321abf11bea7464884b0876c46ff2491 (diff) | |
parent | 4afa5f9617927453ac04b24b584f6c718dfb4f45 (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 in the algif_hash interface that may lead to crashes
when used with certain algorithms such as HMAC"
* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
crypto: algif_hash - Only export and import on sockets with data
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/algif_hash.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c index 1396ad0787fc..b4c24fe3dcfb 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c | |||
@@ -181,9 +181,14 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags) | |||
181 | struct sock *sk2; | 181 | struct sock *sk2; |
182 | struct alg_sock *ask2; | 182 | struct alg_sock *ask2; |
183 | struct hash_ctx *ctx2; | 183 | struct hash_ctx *ctx2; |
184 | bool more; | ||
184 | int err; | 185 | int err; |
185 | 186 | ||
186 | err = crypto_ahash_export(req, state); | 187 | lock_sock(sk); |
188 | more = ctx->more; | ||
189 | err = more ? crypto_ahash_export(req, state) : 0; | ||
190 | release_sock(sk); | ||
191 | |||
187 | if (err) | 192 | if (err) |
188 | return err; | 193 | return err; |
189 | 194 | ||
@@ -194,7 +199,10 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags) | |||
194 | sk2 = newsock->sk; | 199 | sk2 = newsock->sk; |
195 | ask2 = alg_sk(sk2); | 200 | ask2 = alg_sk(sk2); |
196 | ctx2 = ask2->private; | 201 | ctx2 = ask2->private; |
197 | ctx2->more = 1; | 202 | ctx2->more = more; |
203 | |||
204 | if (!more) | ||
205 | return err; | ||
198 | 206 | ||
199 | err = crypto_ahash_import(&ctx2->req, state); | 207 | err = crypto_ahash_import(&ctx2->req, state); |
200 | if (err) { | 208 | if (err) { |