aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-06-09 15:49:57 +1000
committerSteve Bennett <steveb@workware.net.au>2011-06-10 14:00:35 +1000
commit1a5c1c4fe78fdcfa7d5c2fe441dfdbd7c174d2bc (patch)
tree971881ecf3c13be01fa08b9be19d14c2f1183a77
parent700e6599fb1a822e257a8dc6be41ffe1e99a30b2 (diff)
downloadjimtcl-1a5c1c4fe78fdcfa7d5c2fe441dfdbd7c174d2bc.zip
jimtcl-1a5c1c4fe78fdcfa7d5c2fe441dfdbd7c174d2bc.tar.gz
jimtcl-1a5c1c4fe78fdcfa7d5c2fe441dfdbd7c174d2bc.tar.bz2
Move 1.25KB off the stack for PRNG init
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/jim.c b/jim.c
index 2ae8980..52e42d3 100644
--- a/jim.c
+++ b/jim.c
@@ -9324,19 +9324,24 @@ Jim_Obj *Jim_ScanString(Jim_Interp *interp, Jim_Obj *strObjPtr, Jim_Obj *fmtObjP
/* -----------------------------------------------------------------------------
* Pseudo Random Number Generation
* ---------------------------------------------------------------------------*/
-static void JimPrngSeed(Jim_Interp *interp, const unsigned char *seed, int seedLen);
+static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
/* Initialize the sbox with the numbers from 0 to 255 */
static void JimPrngInit(Jim_Interp *interp)
{
+#define PRNG_SEED_SIZE 256
int i;
- /* XXX: Move off stack */
- unsigned int seed[256];
+ unsigned int *seed;
+ time_t t = time(NULL);
interp->prngState = Jim_Alloc(sizeof(Jim_PrngState));
- for (i = 0; i < 256; i++)
- seed[i] = (rand() ^ time(NULL) ^ clock());
- JimPrngSeed(interp, (unsigned char *)seed, sizeof(int) * 256);
+
+ seed = Jim_Alloc(PRNG_SEED_SIZE * sizeof(*seed));
+ for (i = 0; i < PRNG_SEED_SIZE; i++) {
+ seed[i] = (rand() ^ t ^ clock());
+ }
+ JimPrngSeed(interp, (unsigned char *)seed, PRNG_SEED_SIZE * sizeof(*seed));
+ Jim_Free(seed);
}
/* Generates N bytes of random data */
@@ -9363,11 +9368,9 @@ static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len)
}
/* Re-seed the generator with user-provided bytes */
-static void JimPrngSeed(Jim_Interp *interp, const unsigned char *seed, int seedLen)
+static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen)
{
int i;
- /* XXX: Move off stack */
- unsigned char buf[256];
Jim_PrngState *prng;
/* initialization, only needed the first time */
@@ -9387,8 +9390,13 @@ static void JimPrngSeed(Jim_Interp *interp, const unsigned char *seed, int seedL
prng->sbox[seed[i]] = t;
}
prng->i = prng->j = 0;
- /* discard the first 256 bytes of stream. */
- JimRandomBytes(interp, buf, 256);
+
+ /* discard at least the first 256 bytes of stream.
+ * borrow the seed buffer for this
+ */
+ for (i = 0; i < 256; i += seedLen) {
+ JimRandomBytes(interp, seed, seedLen);
+ }
}
/* [incr] */