Skip to content

Commit

Permalink
[CRYPTO] cryptomgr: Fix parsing of nested templates
Browse files Browse the repository at this point in the history
This patch allows the use of nested templates by allowing the use of
brackets inside a template parameter.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
herbertx committed May 2, 2007
1 parent b5b7f08 commit cf02f5d
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions crypto/cryptomgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,17 @@
#include <linux/ctype.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/rtnetlink.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/workqueue.h>

#include "internal.h"

struct cryptomgr_param {
struct work_struct work;
struct task_struct *thread;

struct rtattr *tb[CRYPTOA_MAX];

Expand All @@ -45,10 +45,9 @@ struct cryptomgr_param {
char template[CRYPTO_MAX_ALG_NAME];
};

static void cryptomgr_probe(struct work_struct *work)
static int cryptomgr_probe(void *data)
{
struct cryptomgr_param *param =
container_of(work, struct cryptomgr_param, work);
struct cryptomgr_param *param = data;
struct crypto_template *tmpl;
struct crypto_instance *inst;
int err;
Expand All @@ -72,7 +71,7 @@ static void cryptomgr_probe(struct work_struct *work)

out:
kfree(param);
return;
module_put_and_exit(0);

err:
crypto_larval_error(param->larval.name, param->type.data.type,
Expand All @@ -87,9 +86,12 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
const char *p;
unsigned int len;

if (!try_module_get(THIS_MODULE))
goto err;

param = kzalloc(sizeof(*param), GFP_KERNEL);
if (!param)
goto err;
goto err_put_module;

for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++)
;
Expand All @@ -101,11 +103,18 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)
memcpy(param->template, name, len);

name = p + 1;
for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++)
;
len = 0;
for (p = name; *p; p++) {
for (; isalnum(*p) || *p == '-' || *p == '_' || *p == '('; p++)
;

len = p - name;
if (!len || *p != ')' || p[1])
if (*p != ')')
goto err_free_param;

len = p - name;
}

if (!len || name[len + 1])
goto err_free_param;

param->type.attr.rta_len = sizeof(param->type);
Expand All @@ -121,13 +130,16 @@ static int cryptomgr_schedule_probe(struct crypto_larval *larval)

memcpy(param->larval.name, larval->alg.cra_name, CRYPTO_MAX_ALG_NAME);

INIT_WORK(&param->work, cryptomgr_probe);
schedule_work(&param->work);
param->thread = kthread_run(cryptomgr_probe, param, "cryptomgr");
if (IS_ERR(param->thread))
goto err_free_param;

return NOTIFY_STOP;

err_free_param:
kfree(param);
err_put_module:
module_put(THIS_MODULE);
err:
return NOTIFY_OK;
}
Expand Down

0 comments on commit cf02f5d

Please sign in to comment.