From fb223c32b4d3ee593c8dce07e983680d06abe387 Mon Sep 17 00:00:00 2001 From: Jonathan Corbet Date: Wed, 2 Nov 2011 09:15:16 +1100 Subject: crypto: user - Fix rwsem leak in crypto_user The list_empty case in crypto_alg_match() will return without calling up_read() on crypto_alg_sem. We could do the "goto out" routine, but the function will clearly do the right thing with that test simply removed. Signed-off-by: Jonathan Corbet Signed-off-by: Herbert Xu --- crypto/crypto_user.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c index 2abca780312..0605a2bbba7 100644 --- a/crypto/crypto_user.c +++ b/crypto/crypto_user.c @@ -44,9 +44,6 @@ static struct crypto_alg *crypto_alg_match(struct crypto_user_alg *p, int exact) down_read(&crypto_alg_sem); - if (list_empty(&crypto_alg_list)) - return NULL; - list_for_each_entry(q, &crypto_alg_list, cra_list) { int match = 0; -- cgit v1.2.3 From 3acc84739dd5d746840f881ad4d60bd2a428f1dd Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 3 Nov 2011 23:46:07 +1100 Subject: crypto: algapi - Fix build problem with NET disabled The report functions use NLA_PUT so we need to ensure that NET is enabled. Reported-by: Luis Henriques Signed-off-by: Herbert Xu --- crypto/ablkcipher.c | 14 ++++++++++++++ crypto/aead.c | 14 ++++++++++++++ crypto/ahash.c | 7 +++++++ crypto/blkcipher.c | 7 +++++++ crypto/pcompress.c | 7 +++++++ crypto/rng.c | 7 +++++++ crypto/shash.c | 7 +++++++ 7 files changed, 63 insertions(+) diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index a816f24f2d5..a0f768c1d9a 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c @@ -383,6 +383,7 @@ static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type, return 0; } +#ifdef CONFIG_NET static int crypto_ablkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_blkcipher rblkcipher; @@ -404,6 +405,12 @@ static int crypto_ablkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_ablkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); @@ -457,6 +464,7 @@ static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type, return 0; } +#ifdef CONFIG_NET static int crypto_givcipher_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_blkcipher rblkcipher; @@ -478,6 +486,12 @@ static int crypto_givcipher_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_givcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); diff --git a/crypto/aead.c b/crypto/aead.c index 701556ffaae..04add3dca6f 100644 --- a/crypto/aead.c +++ b/crypto/aead.c @@ -111,6 +111,7 @@ static int crypto_init_aead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) return 0; } +#ifdef CONFIG_NET static int crypto_aead_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_aead raead; @@ -132,6 +133,12 @@ static int crypto_aead_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_aead_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_aead_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); @@ -190,6 +197,7 @@ static int crypto_init_nivaead_ops(struct crypto_tfm *tfm, u32 type, u32 mask) return 0; } +#ifdef CONFIG_NET static int crypto_nivaead_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_aead raead; @@ -210,6 +218,12 @@ static int crypto_nivaead_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_nivaead_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_nivaead_show(struct seq_file *m, struct crypto_alg *alg) diff --git a/crypto/ahash.c b/crypto/ahash.c index a3e6ef99394..ac93c99cfae 100644 --- a/crypto/ahash.c +++ b/crypto/ahash.c @@ -399,6 +399,7 @@ static unsigned int crypto_ahash_extsize(struct crypto_alg *alg) return sizeof(struct crypto_shash *); } +#ifdef CONFIG_NET static int crypto_ahash_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_hash rhash; @@ -416,6 +417,12 @@ static int crypto_ahash_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_ahash_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_ahash_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c index 2572d260013..1e61d1a888b 100644 --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c @@ -494,6 +494,7 @@ static int crypto_init_blkcipher_ops(struct crypto_tfm *tfm, u32 type, u32 mask) return crypto_init_blkcipher_ops_async(tfm); } +#ifdef CONFIG_NET static int crypto_blkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_blkcipher rblkcipher; @@ -515,6 +516,12 @@ static int crypto_blkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_blkcipher_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_blkcipher_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); diff --git a/crypto/pcompress.c b/crypto/pcompress.c index fefda78a6a2..2e458e5482d 100644 --- a/crypto/pcompress.c +++ b/crypto/pcompress.c @@ -48,6 +48,7 @@ static int crypto_pcomp_init_tfm(struct crypto_tfm *tfm) return 0; } +#ifdef CONFIG_NET static int crypto_pcomp_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_comp rpcomp; @@ -62,6 +63,12 @@ static int crypto_pcomp_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_pcomp_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_pcomp_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); diff --git a/crypto/rng.c b/crypto/rng.c index feb7de00f43..64f864fa804 100644 --- a/crypto/rng.c +++ b/crypto/rng.c @@ -60,6 +60,7 @@ static int crypto_init_rng_ops(struct crypto_tfm *tfm, u32 type, u32 mask) return 0; } +#ifdef CONFIG_NET static int crypto_rng_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_rng rrng; @@ -76,6 +77,12 @@ static int crypto_rng_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_rng_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_rng_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); diff --git a/crypto/shash.c b/crypto/shash.c index ea8a9c6e21e..9100912716a 100644 --- a/crypto/shash.c +++ b/crypto/shash.c @@ -524,6 +524,7 @@ static unsigned int crypto_shash_extsize(struct crypto_alg *alg) return alg->cra_ctxsize; } +#ifdef CONFIG_NET static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg) { struct crypto_report_hash rhash; @@ -541,6 +542,12 @@ static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg) nla_put_failure: return -EMSGSIZE; } +#else +static int crypto_shash_report(struct sk_buff *skb, struct crypto_alg *alg) +{ + return -ENOSYS; +} +#endif static void crypto_shash_show(struct seq_file *m, struct crypto_alg *alg) __attribute__ ((unused)); -- cgit v1.2.3