- Fix potential out-of-bounds read in files.c, fix by using new FS_IsExt
- Add capability to load demos with com_protocol suffix, partially applied patches from Simon McVittie - Fix demo loading if protocol number has more digits than 2 - Minor refactoring, replace all occurances of suffix "dm_" with global macro DEMOEXT
This commit is contained in:
parent
fef4d12d68
commit
c0cca7a0a8
6 changed files with 125 additions and 48 deletions
|
@ -627,14 +627,14 @@ void CL_Record_f( void ) {
|
|||
if ( Cmd_Argc() == 2 ) {
|
||||
s = Cmd_Argv(1);
|
||||
Q_strncpyz( demoName, s, sizeof( demoName ) );
|
||||
Com_sprintf (name, sizeof(name), "demos/%s.dm_%d", demoName, PROTOCOL_VERSION );
|
||||
Com_sprintf (name, sizeof(name), "demos/%s.%s%d", demoName, DEMOEXT, com_protocol->integer );
|
||||
} else {
|
||||
int number;
|
||||
|
||||
// scan for a free demo name
|
||||
for ( number = 0 ; number <= 9999 ; number++ ) {
|
||||
CL_DemoFilename( number, demoName );
|
||||
Com_sprintf (name, sizeof(name), "demos/%s.dm_%d", demoName, PROTOCOL_VERSION );
|
||||
Com_sprintf (name, sizeof(name), "demos/%s.%s%d", demoName, DEMOEXT, com_protocol->integer );
|
||||
|
||||
if (!FS_FileExists(name))
|
||||
break; // file doesn't exist
|
||||
|
@ -884,9 +884,22 @@ static void CL_WalkDemoExt(char *arg, char *name, int *demofile)
|
|||
{
|
||||
int i = 0;
|
||||
*demofile = 0;
|
||||
|
||||
Com_sprintf (name, MAX_OSPATH, "demos/%s.%s%d", arg, DEMOEXT, com_protocol->integer);
|
||||
|
||||
FS_FOpenFileRead( name, demofile, qtrue );
|
||||
|
||||
if (*demofile)
|
||||
{
|
||||
Com_Printf("Demo file: %s\n", name);
|
||||
return;
|
||||
}
|
||||
|
||||
Com_Printf("Not found: %s\n", name);
|
||||
|
||||
while(demo_protocols[i])
|
||||
{
|
||||
Com_sprintf (name, MAX_OSPATH, "demos/%s.dm_%d", arg, demo_protocols[i]);
|
||||
Com_sprintf (name, MAX_OSPATH, "demos/%s.%s%d", arg, DEMOEXT, demo_protocols[i]);
|
||||
FS_FOpenFileRead( name, demofile, qtrue );
|
||||
if (*demofile)
|
||||
{
|
||||
|
@ -910,7 +923,7 @@ static void CL_CompleteDemoName( char *args, int argNum )
|
|||
{
|
||||
char demoExt[ 16 ];
|
||||
|
||||
Com_sprintf( demoExt, sizeof( demoExt ), ".dm_%d", PROTOCOL_VERSION );
|
||||
Com_sprintf(demoExt, sizeof(demoExt), ".%s%d", DEMOEXT, com_protocol->integer);
|
||||
Field_CompleteFilename( "demos", demoExt, qtrue, qtrue );
|
||||
}
|
||||
}
|
||||
|
@ -943,34 +956,41 @@ void CL_PlayDemo_f( void ) {
|
|||
|
||||
CL_Disconnect( qtrue );
|
||||
|
||||
// check for an extension .dm_?? (?? is protocol)
|
||||
ext_test = arg + strlen(arg) - 6;
|
||||
if ((strlen(arg) > 6) && (ext_test[0] == '.') &&
|
||||
((ext_test[1] == 'd') || (ext_test[1] == 'D')) &&
|
||||
((ext_test[2] == 'm') || (ext_test[2] == 'M')) &&
|
||||
(ext_test[3] == '_'))
|
||||
// check for an extension .DEMOEXT_?? (?? is protocol)
|
||||
ext_test = Q_strrchr(arg, '.');
|
||||
|
||||
if(ext_test && !Q_stricmpn(ext_test + 1, DEMOEXT, ARRAY_LEN(DEMOEXT) - 1))
|
||||
{
|
||||
protocol = atoi(ext_test+4);
|
||||
i=0;
|
||||
while(demo_protocols[i])
|
||||
protocol = atoi(ext_test + ARRAY_LEN(DEMOEXT));
|
||||
|
||||
for(i = 0; demo_protocols[i]; i++)
|
||||
{
|
||||
if (demo_protocols[i] == protocol)
|
||||
if(demo_protocols[i] == protocol)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (demo_protocols[i])
|
||||
|
||||
if(demo_protocols[i] || protocol == com_protocol->integer)
|
||||
{
|
||||
Com_sprintf (name, sizeof(name), "demos/%s", arg);
|
||||
FS_FOpenFileRead( name, &clc.demofile, qtrue );
|
||||
} else {
|
||||
Com_Printf("Protocol %d not supported for demos\n", protocol);
|
||||
Q_strncpyz(retry, arg, sizeof(retry));
|
||||
retry[strlen(retry)-6] = 0;
|
||||
CL_WalkDemoExt( retry, name, &clc.demofile );
|
||||
Com_sprintf(name, sizeof(name), "demos/%s", arg);
|
||||
FS_FOpenFileRead(name, &clc.demofile, qtrue);
|
||||
}
|
||||
else
|
||||
{
|
||||
int len;
|
||||
|
||||
Com_Printf("Protocol %d not supported for demos\n", protocol);
|
||||
len = ext_test - arg;
|
||||
|
||||
if(len >= ARRAY_LEN(retry))
|
||||
len = ARRAY_LEN(retry) - 1;
|
||||
|
||||
Q_strncpyz(retry, arg, len + 1);
|
||||
retry[len] = '\0';
|
||||
CL_WalkDemoExt(retry, name, &clc.demofile);
|
||||
}
|
||||
} else {
|
||||
CL_WalkDemoExt( arg, name, &clc.demofile );
|
||||
}
|
||||
else
|
||||
CL_WalkDemoExt(arg, name, &clc.demofile);
|
||||
|
||||
if (!clc.demofile) {
|
||||
Com_Error( ERR_DROP, "couldn't open %s", name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue