mirror of
https://github.com/UberGames/lilium-voyager.git
synced 2024-11-10 14:41:42 +00:00
Fix infinite loop in case an invalid pk3 file has been downloaded from the server. Thanks tjw for reporting (#3074)
This commit is contained in:
parent
d93cc3c997
commit
fd57c987c4
5 changed files with 78 additions and 20 deletions
|
@ -332,8 +332,7 @@ void CL_cURL_PerformDownload(void)
|
||||||
qcurl_easy_strerror(msg->data.result),
|
qcurl_easy_strerror(msg->data.result),
|
||||||
code, clc.downloadURL);
|
code, clc.downloadURL);
|
||||||
}
|
}
|
||||||
*clc.downloadTempName = *clc.downloadName = 0;
|
|
||||||
Cvar_Set( "cl_downloadName", "" );
|
|
||||||
CL_NextDownload();
|
CL_NextDownload();
|
||||||
}
|
}
|
||||||
#endif /* USE_CURL */
|
#endif /* USE_CURL */
|
||||||
|
|
|
@ -1916,11 +1916,25 @@ CL_NextDownload
|
||||||
A download completed or failed
|
A download completed or failed
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void CL_NextDownload(void) {
|
void CL_NextDownload(void)
|
||||||
|
{
|
||||||
char *s;
|
char *s;
|
||||||
char *remoteName, *localName;
|
char *remoteName, *localName;
|
||||||
qboolean useCURL = qfalse;
|
qboolean useCURL = qfalse;
|
||||||
|
|
||||||
|
// A download has finished, check whether this matches a referenced checksum
|
||||||
|
if(*clc.downloadName)
|
||||||
|
{
|
||||||
|
char *zippath = FS_BuildOSPath(Cvar_VariableString("fs_homepath"), clc.downloadName, "");
|
||||||
|
zippath[strlen(zippath)-1] = '\0';
|
||||||
|
|
||||||
|
if(!FS_CompareZipChecksum(zippath))
|
||||||
|
Com_Error(ERR_DROP, "Incorrect checksum for file: %s", clc.downloadName);
|
||||||
|
}
|
||||||
|
|
||||||
|
*clc.downloadTempName = *clc.downloadName = 0;
|
||||||
|
Cvar_Set("cl_downloadName", "");
|
||||||
|
|
||||||
// We are looking to start a download here
|
// We are looking to start a download here
|
||||||
if (*clc.downloadList) {
|
if (*clc.downloadList) {
|
||||||
s = clc.downloadList;
|
s = clc.downloadList;
|
||||||
|
@ -2027,6 +2041,10 @@ void CL_InitDownloads(void) {
|
||||||
if ( *clc.downloadList ) {
|
if ( *clc.downloadList ) {
|
||||||
// if autodownloading is not enabled on the server
|
// if autodownloading is not enabled on the server
|
||||||
cls.state = CA_CONNECTED;
|
cls.state = CA_CONNECTED;
|
||||||
|
|
||||||
|
*clc.downloadTempName = *clc.downloadName = 0;
|
||||||
|
Cvar_Set( "cl_downloadName", "" );
|
||||||
|
|
||||||
CL_NextDownload();
|
CL_NextDownload();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -619,8 +619,6 @@ void CL_ParseDownload ( msg_t *msg ) {
|
||||||
// rename the file
|
// rename the file
|
||||||
FS_SV_Rename ( clc.downloadTempName, clc.downloadName );
|
FS_SV_Rename ( clc.downloadTempName, clc.downloadName );
|
||||||
}
|
}
|
||||||
*clc.downloadTempName = *clc.downloadName = 0;
|
|
||||||
Cvar_Set( "cl_downloadName", "" );
|
|
||||||
|
|
||||||
// send intentions now
|
// send intentions now
|
||||||
// We need this because without it, we would hold the last nextdl and then start
|
// We need this because without it, we would hold the last nextdl and then start
|
||||||
|
|
|
@ -1660,7 +1660,7 @@ Creates a new pak_t in the search chain for the contents
|
||||||
of a zip file.
|
of a zip file.
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
static pack_t *FS_LoadZipFile( char *zipfile, const char *basename )
|
static pack_t *FS_LoadZipFile(const char *zipfile, const char *basename)
|
||||||
{
|
{
|
||||||
fileInPack_t *buildBuffer;
|
fileInPack_t *buildBuffer;
|
||||||
pack_t *pack;
|
pack_t *pack;
|
||||||
|
@ -1683,8 +1683,6 @@ static pack_t *FS_LoadZipFile( char *zipfile, const char *basename )
|
||||||
if (err != UNZ_OK)
|
if (err != UNZ_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
fs_packFiles += gi.number_entry;
|
|
||||||
|
|
||||||
len = 0;
|
len = 0;
|
||||||
unzGoToFirstFile(uf);
|
unzGoToFirstFile(uf);
|
||||||
for (i = 0; i < gi.number_entry; i++)
|
for (i = 0; i < gi.number_entry; i++)
|
||||||
|
@ -1751,8 +1749,8 @@ static pack_t *FS_LoadZipFile( char *zipfile, const char *basename )
|
||||||
unzGoToNextFile(uf);
|
unzGoToNextFile(uf);
|
||||||
}
|
}
|
||||||
|
|
||||||
pack->checksum = Com_BlockChecksum( &fs_headerLongs[ 1 ], 4 * ( fs_numHeaderLongs - 1 ) );
|
pack->checksum = Com_BlockChecksum( &fs_headerLongs[ 1 ], sizeof(*fs_headerLongs) * ( fs_numHeaderLongs - 1 ) );
|
||||||
pack->pure_checksum = Com_BlockChecksum( fs_headerLongs, 4 * fs_numHeaderLongs );
|
pack->pure_checksum = Com_BlockChecksum( fs_headerLongs, sizeof(*fs_headerLongs) * fs_numHeaderLongs );
|
||||||
pack->checksum = LittleLong( pack->checksum );
|
pack->checksum = LittleLong( pack->checksum );
|
||||||
pack->pure_checksum = LittleLong( pack->pure_checksum );
|
pack->pure_checksum = LittleLong( pack->pure_checksum );
|
||||||
|
|
||||||
|
@ -1762,6 +1760,50 @@ static pack_t *FS_LoadZipFile( char *zipfile, const char *basename )
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
FS_FreePak
|
||||||
|
|
||||||
|
Frees a pak structure and releases all associated resources
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void FS_FreePak(pack_t *thepak)
|
||||||
|
{
|
||||||
|
unzClose(thepak->handle);
|
||||||
|
Z_Free(thepak->buildBuffer);
|
||||||
|
Z_Free(thepak);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
FS_GetZipChecksum
|
||||||
|
|
||||||
|
Compares whether the given pak file matches a referenced checksum
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
qboolean FS_CompareZipChecksum(const char *zipfile)
|
||||||
|
{
|
||||||
|
pack_t *thepak;
|
||||||
|
int index, checksum;
|
||||||
|
|
||||||
|
thepak = FS_LoadZipFile(zipfile, "");
|
||||||
|
|
||||||
|
if(!thepak)
|
||||||
|
return qfalse;
|
||||||
|
|
||||||
|
checksum = thepak->checksum;
|
||||||
|
FS_FreePak(thepak);
|
||||||
|
|
||||||
|
for(index = 0; index < fs_numServerReferencedPaks; index++)
|
||||||
|
{
|
||||||
|
if(checksum == fs_serverReferencedPaks[index])
|
||||||
|
return qtrue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return qfalse;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================================================================================
|
=================================================================================
|
||||||
|
|
||||||
|
@ -2466,6 +2508,8 @@ void FS_AddGameDirectory( const char *path, const char *dir ) {
|
||||||
continue;
|
continue;
|
||||||
// store the game name for downloading
|
// store the game name for downloading
|
||||||
strcpy(pak->pakGamename, dir);
|
strcpy(pak->pakGamename, dir);
|
||||||
|
|
||||||
|
fs_packFiles += pak->numfiles;
|
||||||
|
|
||||||
search = Z_Malloc (sizeof(searchpath_t));
|
search = Z_Malloc (sizeof(searchpath_t));
|
||||||
search->pack = pak;
|
search->pack = pak;
|
||||||
|
@ -2655,18 +2699,16 @@ void FS_Shutdown( qboolean closemfp ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// free everything
|
// free everything
|
||||||
for ( p = fs_searchpaths ; p ; p = next ) {
|
for(p = fs_searchpaths; p; p = next)
|
||||||
|
{
|
||||||
next = p->next;
|
next = p->next;
|
||||||
|
|
||||||
if ( p->pack ) {
|
if(p->pack)
|
||||||
unzClose(p->pack->handle);
|
FS_FreePak(p->pack);
|
||||||
Z_Free( p->pack->buildBuffer );
|
if (p->dir)
|
||||||
Z_Free( p->pack );
|
Z_Free(p->dir);
|
||||||
}
|
|
||||||
if ( p->dir ) {
|
Z_Free(p);
|
||||||
Z_Free( p->dir );
|
|
||||||
}
|
|
||||||
Z_Free( p );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// any FS_ calls will now be an error until reinitialized
|
// any FS_ calls will now be an error until reinitialized
|
||||||
|
|
|
@ -605,6 +605,7 @@ qboolean FS_FileExists( const char *file );
|
||||||
|
|
||||||
qboolean FS_CreatePath (char *OSPath);
|
qboolean FS_CreatePath (char *OSPath);
|
||||||
char *FS_BuildOSPath( const char *base, const char *game, const char *qpath );
|
char *FS_BuildOSPath( const char *base, const char *game, const char *qpath );
|
||||||
|
qboolean FS_CompareZipChecksum(const char *zipfile);
|
||||||
|
|
||||||
int FS_LoadStack( void );
|
int FS_LoadStack( void );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue