aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/cryptomgr.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-05-08 23:04:39 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2007-05-08 23:04:39 -0400
commit1605b8471d64c855bc2493abf3adf6a1ebc3e645 (patch)
tree9196656af011cb1b678b27fc76f47355134f3256 /crypto/cryptomgr.c
parentf6259deacfd55607ae57cff422d3bc7694ea14e7 (diff)
[CRYPTO] cryptomgr: Fix use after free
By the time kthread_run returns the param may have already been freed so writing the returned thread_struct pointer to param is wrong. In fact, we don't need it in param anyway so this patch simply puts it on the stack. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/cryptomgr.c')
-rw-r--r--crypto/cryptomgr.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/crypto/cryptomgr.c b/crypto/cryptomgr.c
index 6958ea83ee44..e5fb7cca5107 100644
--- a/crypto/cryptomgr.c
+++ b/crypto/cryptomgr.c
@@ -24,8 +24,6 @@
24#include "internal.h" 24#include "internal.h"
25 25
26struct cryptomgr_param { 26struct cryptomgr_param {
27 struct task_struct *thread;
28
29 struct rtattr *tb[CRYPTOA_MAX]; 27 struct rtattr *tb[CRYPTOA_MAX];
30 28
31 struct { 29 struct {
@@ -81,6 +79,7 @@ err:
81 79
82static int cryptomgr_schedule_probe(struct crypto_larval *larval) 80static int cryptomgr_schedule_probe(struct crypto_larval *larval)
83{ 81{
82 struct task_struct *thread;
84 struct cryptomgr_param *param; 83 struct cryptomgr_param *param;
85 const char *name = larval->alg.cra_name; 84 const char *name = larval->alg.cra_name;
86 const char *p; 85 const char *p;
@@ -130,8 +129,8 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
130 129
131 memcpy(param->larval.name, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME); 130 memcpy(param->larval.name, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME);
132 131
133 param->thread = kthread_run(cryptomgr_probe, param, "cryptomgr"); 132 thread = kthread_run(cryptomgr_probe, param, "cryptomgr");
134 if (IS_ERR(param->thread)) 133 if (IS_ERR(thread))
135 goto err_free_param; 134 goto err_free_param;
136 135
137 return NOTIFY_STOP; 136 return NOTIFY_STOP;