Skip to content

Commit

Permalink
- Introduce seeding of the random number generator at startup
Browse files Browse the repository at this point in the history
- Replaced all engine-side occurances of rand() with random()
  • Loading branch information
Thilo Schulz committed May 31, 2009
1 parent 7aed7e8 commit b40f150
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 17 deletions.
8 changes: 2 additions & 6 deletions code/client/cl_main.c
Expand Up @@ -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 );
Expand Down
26 changes: 22 additions & 4 deletions code/qcommon/common.c
Expand Up @@ -2500,6 +2500,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
Expand All @@ -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 ();
Expand Down Expand Up @@ -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 );
}

6 changes: 2 additions & 4 deletions code/renderer/tr_noise.c
Expand Up @@ -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 );
}
}

Expand Down
2 changes: 1 addition & 1 deletion code/server/sv_client.c
Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions code/server/sv_init.c
Expand Up @@ -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 );
Expand Down

0 comments on commit b40f150

Please sign in to comment.