Skip to content

Commit

Permalink
crypto: ansi_prng - Use just a BH lock
Browse files Browse the repository at this point in the history
The current code uses a mix of sping_lock() & spin_lock_irqsave(). This can
lead to deadlock with the correct timming & cprng_get_random() + cprng_reset()
sequence.
I've converted them to bottom half locks since all three user grab just a BH
lock so this runs probably in softirq :)

Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Acked-by: Neil Horman <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
sebastianas authored and herbertx committed Jul 3, 2009
1 parent a68f661 commit ed94070
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions crypto/ansi_cprng.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ static int _get_more_prng_bytes(struct prng_context *ctx)
/* Our exported functions */
static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx)
{
unsigned long flags;
unsigned char *ptr = buf;
unsigned int byte_count = (unsigned int)nbytes;
int err;
Expand All @@ -196,7 +195,7 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx)
if (nbytes < 0)
return -EINVAL;

spin_lock_irqsave(&ctx->prng_lock, flags);
spin_lock_bh(&ctx->prng_lock);

err = -EINVAL;
if (ctx->flags & PRNG_NEED_RESET)
Expand Down Expand Up @@ -268,7 +267,7 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx)
goto remainder;

done:
spin_unlock_irqrestore(&ctx->prng_lock, flags);
spin_unlock_bh(&ctx->prng_lock);
dbgprint(KERN_CRIT "returning %d from get_prng_bytes in context %p\n",
err, ctx);
return err;
Expand All @@ -287,7 +286,7 @@ static int reset_prng_context(struct prng_context *ctx,
int rc = -EINVAL;
unsigned char *prng_key;

spin_lock(&ctx->prng_lock);
spin_lock_bh(&ctx->prng_lock);
ctx->flags |= PRNG_NEED_RESET;

prng_key = (key != NULL) ? key : (unsigned char *)DEFAULT_PRNG_KEY;
Expand Down Expand Up @@ -332,7 +331,7 @@ static int reset_prng_context(struct prng_context *ctx,
rc = 0;
ctx->flags &= ~PRNG_NEED_RESET;
out:
spin_unlock(&ctx->prng_lock);
spin_unlock_bh(&ctx->prng_lock);

return rc;

Expand Down

0 comments on commit ed94070

Please sign in to comment.