From ef7e3d1c9490a0acdcff7f8869a86ad6e127e127 Mon Sep 17 00:00:00 2001 From: Jarod Wilson Date: Thu, 13 Nov 2008 22:03:20 +0800 Subject: [PATCH] --- yaml --- r: 120608 b: refs/heads/master c: aa1a85dbd1d3265ca36f684026fe7689b7836bed h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/crypto/ansi_cprng.c | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 5434f57f1932..b826f6170bd2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 31a61bfc6e415fbd871317cbee7b8a4158d8ac5b +refs/heads/master: aa1a85dbd1d3265ca36f684026fe7689b7836bed diff --git a/trunk/crypto/ansi_cprng.c b/trunk/crypto/ansi_cprng.c index 486aa93646f7..1b3b1da1fd35 100644 --- a/trunk/crypto/ansi_cprng.c +++ b/trunk/crypto/ansi_cprng.c @@ -223,9 +223,10 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) } /* - * Copy up to the next whole block size + * Copy any data less than an entire block */ if (byte_count < DEFAULT_BLK_SZ) { +empty_rbuf: for (; ctx->rand_data_valid < DEFAULT_BLK_SZ; ctx->rand_data_valid++) { *ptr = ctx->rand_data[ctx->rand_data_valid]; @@ -240,18 +241,22 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) * Now copy whole blocks */ for (; byte_count >= DEFAULT_BLK_SZ; byte_count -= DEFAULT_BLK_SZ) { - if (_get_more_prng_bytes(ctx) < 0) { - memset(buf, 0, nbytes); - err = -EINVAL; - goto done; + if (ctx->rand_data_valid == DEFAULT_BLK_SZ) { + if (_get_more_prng_bytes(ctx) < 0) { + memset(buf, 0, nbytes); + err = -EINVAL; + goto done; + } } + if (ctx->rand_data_valid > 0) + goto empty_rbuf; memcpy(ptr, ctx->rand_data, DEFAULT_BLK_SZ); ctx->rand_data_valid += DEFAULT_BLK_SZ; ptr += DEFAULT_BLK_SZ; } /* - * Now copy any extra partial data + * Now go back and get any remaining partial block */ if (byte_count) goto remainder;