| Index: third_party/sqlite/src/src/random.c | 
| diff --git a/third_party/sqlite/src/src/random.c b/third_party/sqlite/src/src/random.c | 
| index 234ebdf658f436cc7c68f027c48b0e1b9ba34e98..b82566524c40c6bb87154a259d7c24077d54e394 100644 | 
| --- a/third_party/sqlite/src/src/random.c | 
| +++ b/third_party/sqlite/src/src/random.c | 
| @@ -28,24 +28,11 @@ static SQLITE_WSD struct sqlite3PrngType { | 
| } sqlite3Prng; | 
|  | 
| /* | 
| -** Get a single 8-bit random value from the RC4 PRNG.  The Mutex | 
| -** must be held while executing this routine. | 
| -** | 
| -** Why not just use a library random generator like lrand48() for this? | 
| -** Because the OP_NewRowid opcode in the VDBE depends on having a very | 
| -** good source of random numbers.  The lrand48() library function may | 
| -** well be good enough.  But maybe not.  Or maybe lrand48() has some | 
| -** subtle problems on some systems that could cause problems.  It is hard | 
| -** to know.  To minimize the risk of problems due to bad lrand48() | 
| -** implementations, SQLite uses this random number generator based | 
| -** on RC4, which we know works very well. | 
| -** | 
| -** (Later):  Actually, OP_NewRowid does not depend on a good source of | 
| -** randomness any more.  But we will leave this code in all the same. | 
| +** Return N random bytes. | 
| */ | 
| -static u8 randomByte(void){ | 
| +void sqlite3_randomness(int N, void *pBuf){ | 
| unsigned char t; | 
| - | 
| +  unsigned char *zBuf = pBuf; | 
|  | 
| /* The "wsdPrng" macro will resolve to the pseudo-random number generator | 
| ** state vector.  If writable static data is unsupported on the target, | 
| @@ -60,6 +47,16 @@ static u8 randomByte(void){ | 
| # define wsdPrng sqlite3Prng | 
| #endif | 
|  | 
| +#if SQLITE_THREADSAFE | 
| +  sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); | 
| +  sqlite3_mutex_enter(mutex); | 
| +#endif | 
| + | 
| +  if( N<=0 ){ | 
| +    wsdPrng.isInit = 0; | 
| +    sqlite3_mutex_leave(mutex); | 
| +    return; | 
| +  } | 
|  | 
| /* Initialize the state of the random number generator once, | 
| ** the first time this routine is called.  The seed value does | 
| @@ -88,29 +85,16 @@ static u8 randomByte(void){ | 
| wsdPrng.isInit = 1; | 
| } | 
|  | 
| -  /* Generate and return single random byte | 
| -  */ | 
| -  wsdPrng.i++; | 
| -  t = wsdPrng.s[wsdPrng.i]; | 
| -  wsdPrng.j += t; | 
| -  wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; | 
| -  wsdPrng.s[wsdPrng.j] = t; | 
| -  t += wsdPrng.s[wsdPrng.i]; | 
| -  return wsdPrng.s[t]; | 
| -} | 
| - | 
| -/* | 
| -** Return N random bytes. | 
| -*/ | 
| -void sqlite3_randomness(int N, void *pBuf){ | 
| -  unsigned char *zBuf = pBuf; | 
| -#if SQLITE_THREADSAFE | 
| -  sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG); | 
| -#endif | 
| -  sqlite3_mutex_enter(mutex); | 
| -  while( N-- ){ | 
| -    *(zBuf++) = randomByte(); | 
| -  } | 
| +  assert( N>0 ); | 
| +  do{ | 
| +    wsdPrng.i++; | 
| +    t = wsdPrng.s[wsdPrng.i]; | 
| +    wsdPrng.j += t; | 
| +    wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j]; | 
| +    wsdPrng.s[wsdPrng.j] = t; | 
| +    t += wsdPrng.s[wsdPrng.i]; | 
| +    *(zBuf++) = wsdPrng.s[t]; | 
| +  }while( --N ); | 
| sqlite3_mutex_leave(mutex); | 
| } | 
|  | 
| @@ -139,7 +123,4 @@ void sqlite3PrngRestoreState(void){ | 
| sizeof(sqlite3Prng) | 
| ); | 
| } | 
| -void sqlite3PrngResetState(void){ | 
| -  GLOBAL(struct sqlite3PrngType, sqlite3Prng).isInit = 0; | 
| -} | 
| #endif /* SQLITE_OMIT_BUILTIN_TEST */ | 
|  |