[quake3-commits] r1602 - in trunk/code: qcommon sys
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Mon Sep 14 20:19:22 EDT 2009
Author: icculus
Date: 2009-09-14 20:19:22 -0400 (Mon, 14 Sep 2009)
New Revision: 1602
Modified:
trunk/code/qcommon/files.c
trunk/code/qcommon/qcommon.h
trunk/code/sys/sys_unix.c
Log:
Fixed infinite recursion of writing crashlog because we're out of file handles.
Fixes Bugzilla #3772.
Modified: trunk/code/qcommon/files.c
===================================================================
--- trunk/code/qcommon/files.c 2009-09-14 23:56:09 UTC (rev 1601)
+++ trunk/code/qcommon/files.c 2009-09-15 00:19:22 UTC (rev 1602)
@@ -478,7 +478,7 @@
Creates any directories needed to store the given filename
============
*/
-static qboolean FS_CreatePath (char *OSPath) {
+qboolean FS_CreatePath (char *OSPath) {
char *ofs;
// make absolutely sure that it can't back up the path
Modified: trunk/code/qcommon/qcommon.h
===================================================================
--- trunk/code/qcommon/qcommon.h 2009-09-14 23:56:09 UTC (rev 1601)
+++ trunk/code/qcommon/qcommon.h 2009-09-15 00:19:22 UTC (rev 1602)
@@ -602,6 +602,7 @@
qboolean FS_FileExists( const char *file );
+qboolean FS_CreatePath (char *OSPath);
char *FS_BuildOSPath( const char *base, const char *game, const char *qpath );
int FS_LoadStack( void );
Modified: trunk/code/sys/sys_unix.c
===================================================================
--- trunk/code/sys/sys_unix.c 2009-09-14 23:56:09 UTC (rev 1601)
+++ trunk/code/sys/sys_unix.c 2009-09-15 00:19:22 UTC (rev 1602)
@@ -35,6 +35,7 @@
#include <sys/time.h>
#include <pwd.h>
#include <libgen.h>
+#include <fcntl.h>
// Used to determine where to store user-specific files
static char homePath[ MAX_OSPATH ] = { 0 };
@@ -501,23 +502,39 @@
{
char buffer[ 1024 ];
unsigned int size;
- fileHandle_t f;
+ int f = -1;
+ const char *homepath = Cvar_VariableString( "fs_homepath" );
+ const char *gamedir = Cvar_VariableString( "fs_gamedir" );
const char *fileName = "crashlog.txt";
+ char *ospath = FS_BuildOSPath( homepath, gamedir, fileName );
Sys_Print( va( "%s\n", error ) );
- // Write console log to file
- f = FS_FOpenFileWrite( fileName );
- if( !f )
+ /* make sure the write path for the crashlog exists... */
+ if( FS_CreatePath( ospath ) ) {
+ Com_Printf( "ERROR: couldn't create path '%s' for crash log.\n", ospath );
+ return;
+ }
+
+ /* we might be crashing because we maxed out the Quake MAX_FILE_HANDLES,
+ which will come through here, so we don't want to recurse forever by
+ calling FS_FOpenFileWrite()...use the Unix system APIs instead. */
+ f = open(ospath, O_CREAT | O_TRUNC | O_WRONLY, 0640);
+ if( f == -1 )
{
Com_Printf( "ERROR: couldn't open %s\n", fileName );
return;
}
- while( ( size = CON_LogRead( buffer, sizeof( buffer ) ) ) > 0 )
- FS_Write( buffer, size, f );
+ /* We're crashing, so we don't care much if write() or close() fails. */
+ while( ( size = CON_LogRead( buffer, sizeof( buffer ) ) ) > 0 ) {
+ if (write( f, buffer, size ) != size) {
+ Com_Printf( "ERROR: couldn't fully write to %s\n", fileName );
+ break;
+ }
+ }
- FS_FCloseFile( f );
+ close(f);
}
/*
More information about the quake3-commits
mailing list