aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-05-31 19:48:28 +0000
committerthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2009-05-31 19:48:28 +0000
commite3fc31a512c6636777ab81a31eff789f2d4c64ff (patch)
treed13f686d79db091c7bbf5c5cc8a706a3d92ec70c
parent25f4f42f9bfa511cc7e170a379855f5c2419a8d2 (diff)
downloadioquake3-aero-e3fc31a512c6636777ab81a31eff789f2d4c64ff.tar.gz
ioquake3-aero-e3fc31a512c6636777ab81a31eff789f2d4c64ff.zip
- Introduce seeding of the random number generator at startup
- Replaced all engine-side occurances of rand() with random() git-svn-id: svn://svn.icculus.org/quake3/trunk@1561 edf5b092-35ff-0310-97b2-ce42778d08ea
-rw-r--r--code/client/cl_main.c8
-rw-r--r--code/qcommon/common.c26
-rw-r--r--code/renderer/tr_noise.c6
-rw-r--r--code/server/sv_client.c2
-rw-r--r--code/server/sv_init.c3
5 files changed, 28 insertions, 17 deletions
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index 01c044a..08ee747 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -1306,12 +1306,8 @@ void CL_RequestMotd( void ) {
BigShort( cls.updateServer.port ) );
info[0] = 0;
- // NOTE TTimo xoring against Com_Milliseconds, otherwise we may not have a true randomization
- // only srand I could catch before here is tr_noise.c l:26 srand(1001)
- // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=382
- // NOTE: the Com_Milliseconds xoring only affects the lower 16-bit word,
- // but I decided it was enough randomization
- Com_sprintf( cls.updateChallenge, sizeof( cls.updateChallenge ), "%i", ((rand() << 16) ^ rand()) ^ Com_Milliseconds());
+
+ Com_sprintf( cls.updateChallenge, sizeof( cls.updateChallenge ), "%i", (random() << 16) ^ random());
Info_SetValueForKey( info, "challenge", cls.updateChallenge );
Info_SetValueForKey( info, "renderer", cls.glconfig.renderer_string );
diff --git a/code/qcommon/common.c b/code/qcommon/common.c
index e8a95a5..0f28072 100644
--- a/code/qcommon/common.c
+++ b/code/qcommon/common.c
@@ -2502,6 +2502,22 @@ static void Com_DetectAltivec(void)
/*
=================
+Com_InitRand
+Seed the random number generator, if possible with an OS supplied random seed.
+=================
+*/
+static void Com_InitRand(void)
+{
+ unsigned int seed;
+
+ if(Sys_Random(&seed, sizeof(seed)))
+ srand(seed);
+ else
+ srand(time(NULL));
+}
+
+/*
+=================
Com_Init
=================
*/
@@ -2519,8 +2535,11 @@ void Com_Init( char *commandLine ) {
Com_Memset( &eventQueue[ 0 ], 0, MAX_QUEUED_EVENTS * sizeof( sysEvent_t ) );
Com_Memset( &sys_packetReceived[ 0 ], 0, MAX_MSGLEN * sizeof( byte ) );
- // do this before anything else decides to push events
- Com_InitPushEvent();
+ // initialize the weak pseudo-random number generator for use later.
+ Com_InitRand();
+
+ // do this before anything else decides to push events
+ Com_InitPushEvent();
Com_InitSmallZoneMemory();
Cvar_Init ();
@@ -3322,8 +3341,7 @@ void Com_RandomBytes( byte *string, int len )
return;
Com_Printf( "Com_RandomBytes: using weak randomization\n" );
- srand( time( 0 ) );
for( i = 0; i < len; i++ )
- string[i] = (unsigned char)( rand() % 255 );
+ string[i] = (unsigned char)( random() % 255 );
}
diff --git a/code/renderer/tr_noise.c b/code/renderer/tr_noise.c
index 5d550a3..f27e6ab 100644
--- a/code/renderer/tr_noise.c
+++ b/code/renderer/tr_noise.c
@@ -44,12 +44,10 @@ void R_NoiseInit( void )
{
int i;
- srand( 1001 );
-
for ( i = 0; i < NOISE_SIZE; i++ )
{
- s_noise_table[i] = ( float ) ( ( ( rand() / ( float ) RAND_MAX ) * 2.0 - 1.0 ) );
- s_noise_perm[i] = ( unsigned char ) ( rand() / ( float ) RAND_MAX * 255 );
+ s_noise_table[i] = ( float ) ( ( ( random() / ( float ) RAND_MAX ) * 2.0 - 1.0 ) );
+ s_noise_perm[i] = ( unsigned char ) ( random() / ( float ) RAND_MAX * 255 );
}
}
diff --git a/code/server/sv_client.c b/code/server/sv_client.c
index e208a5b..6c3e2e0 100644
--- a/code/server/sv_client.c
+++ b/code/server/sv_client.c
@@ -73,7 +73,7 @@ void SV_GetChallenge( netadr_t from ) {
// this is the first time this client has asked for a challenge
challenge = &svs.challenges[oldest];
- challenge->challenge = ( (rand() << 16) ^ rand() ) ^ svs.time;
+ challenge->challenge = ( (random() << 16) ^ random() ) ^ svs.time;
challenge->adr = from;
challenge->firstTime = svs.time;
challenge->time = svs.time;
diff --git a/code/server/sv_init.c b/code/server/sv_init.c
index 874aeaf..47c9810 100644
--- a/code/server/sv_init.c
+++ b/code/server/sv_init.c
@@ -475,8 +475,7 @@ void SV_SpawnServer( char *server, qboolean killBots ) {
Cvar_Set("cl_paused", "0");
// get a new checksum feed and restart the file system
- srand(Com_Milliseconds());
- sv.checksumFeed = ( ((int) rand() << 16) ^ rand() ) ^ Com_Milliseconds();
+ sv.checksumFeed = ( ((int) random() << 16) ^ random() ) ^ Com_Milliseconds();
FS_Restart( sv.checksumFeed );
CM_LoadMap( va("maps/%s.bsp", server), qfalse, &checksum );