summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-11-11 12:23:07 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-11-11 12:23:07 -0500
commit65d57b3050eed3d848e51761904668b5d156743c (patch)
tree3445d4ea3d11415cf570e56d5dbd74c5578836de /crypto
parentc8fff3ed321abf11bea7464884b0876c46ff2491 (diff)
parent4afa5f9617927453ac04b24b584f6c718dfb4f45 (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.c12
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) {