From 37d631212417d0e40f71fcad2c2a1df907165aa0 Mon Sep 17 00:00:00 2001 From: tma Date: Sat, 5 Jul 2008 23:50:38 +0000 Subject: * (bug 3610) Server sending unnecessary newline with SV_ConSay_F (Tyler Schwend ) * (bug 3623) COMMAND is mapped to the ALT key (Matthias ) * (bug 3665) Typo error in FS_FOpenFileByMode function (TsT ) * (bug 3669) Some files left out of Solaris Packages (Vincent Cojot ) * (bug 3680) server quit messages (Ben Millwood) * (bug 3682) Maps with >1024 models cause a segfault (misantropia ) * (bug 3683) R_FindShader(): negative lightmap indexes cause stray pointers (misantropia ) * (bug 3688) q3asm potential segfault fix and other changes (TsT ) * (bug 3695) Not allowing to write file with lib extention (.dll/.so/...) (TsT ) * (bug 3696) make-macosx-ub.sh outdated by revision 1340; test for Tiger not working (Matthias ) * (bug 3698) #error reported as warning in q3cpp (and no #warning support) (Ben Millwood) * (bug 3703) restoring the valued pre-SDL window behaviour (/dev/humancontroller ) git-svn-id: svn://svn.icculus.org/quake3/trunk@1405 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/qcommon/common.c | 3 +- code/qcommon/files.c | 36 ++++++++++++++++- code/renderer/tr_bsp.c | 3 ++ code/renderer/tr_local.h | 10 +++-- code/renderer/tr_shader.c | 7 +++- code/sdl/sdl_input.c | 26 ++++++++---- code/server/sv_ccmds.c | 2 +- code/tools/asm/q3asm.c | 99 ++++++++++++++++++++++++---------------------- code/tools/lcc/cpp/cpp.c | 7 +++- code/tools/lcc/cpp/cpp.h | 2 +- code/tools/lcc/cpp/nlist.c | 1 + 11 files changed, 131 insertions(+), 65 deletions(-) (limited to 'code') diff --git a/code/qcommon/common.c b/code/qcommon/common.c index 9dc4b17..d4cab1e 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -331,8 +331,9 @@ do the apropriate things. */ void Com_Quit_f( void ) { // don't try to shutdown if we are in a recursive error + char *p = Cmd_Args( ); if ( !com_errorEntered ) { - SV_Shutdown ("Server quit"); + SV_Shutdown (p[0] ? p : "Server quit"); CL_Shutdown (); Com_Shutdown (); FS_Shutdown(qtrue); diff --git a/code/qcommon/files.c b/code/qcommon/files.c index 64fe8d5..821de07 100644 --- a/code/qcommon/files.c +++ b/code/qcommon/files.c @@ -494,6 +494,24 @@ static qboolean FS_CreatePath (char *OSPath) { return qfalse; } +/* +================= +FS_FilenameIsExecutable + +ERR_FATAL if trying to maniuplate a file with the platform library extension +================= + */ +static void FS_FilenameIsExecutable( const char *filename, const char *function ) +{ + // Check if the filename ends with the library extension + if( !Q_stricmp( filename + strlen( filename ) - strlen( DLL_EXT ), DLL_EXT ) ) + { + Com_Error( ERR_FATAL, "%s: Not allowed to write '%s' due to %s extension\n", + function, filename, DLL_EXT ); + } +} + + /* ================= FS_CopyFile @@ -508,6 +526,8 @@ static void FS_CopyFile( char *fromOSPath, char *toOSPath ) { Com_Printf( "copy %s to %s\n", fromOSPath, toOSPath ); + FS_FilenameIsExecutable( toOSPath, __FUNCTION__ ); + if (strstr(fromOSPath, "journal.dat") || strstr(fromOSPath, "journaldata.dat")) { Com_Printf( "Ignoring journal files\n"); return; @@ -549,6 +569,8 @@ FS_Remove =========== */ void FS_Remove( const char *osPath ) { + FS_FilenameIsExecutable( osPath, __FUNCTION__ ); + remove( osPath ); } @@ -559,6 +581,8 @@ FS_HomeRemove =========== */ void FS_HomeRemove( const char *homePath ) { + FS_FilenameIsExecutable( homePath, __FUNCTION__ ); + remove( FS_BuildOSPath( fs_homepath->string, fs_gamedir, homePath ) ); } @@ -636,6 +660,8 @@ fileHandle_t FS_SV_FOpenFileWrite( const char *filename ) { Com_Printf( "FS_SV_FOpenFileWrite: %s\n", ospath ); } + FS_FilenameIsExecutable( ospath, __FUNCTION__ ); + if( FS_CreatePath( ospath ) ) { return 0; } @@ -745,6 +771,8 @@ void FS_SV_Rename( const char *from, const char *to ) { Com_Printf( "FS_SV_Rename: %s --> %s\n", from_ospath, to_ospath ); } + FS_FilenameIsExecutable( to_ospath, __FUNCTION__ ); + if (rename( from_ospath, to_ospath )) { // Failed, try copying it and deleting the original FS_CopyFile ( from_ospath, to_ospath ); @@ -777,6 +805,8 @@ void FS_Rename( const char *from, const char *to ) { Com_Printf( "FS_Rename: %s --> %s\n", from_ospath, to_ospath ); } + FS_FilenameIsExecutable( to_ospath, __FUNCTION__ ); + if (rename( from_ospath, to_ospath )) { // Failed, try copying it and deleting the original FS_CopyFile ( from_ospath, to_ospath ); @@ -838,6 +868,8 @@ fileHandle_t FS_FOpenFileWrite( const char *filename ) { Com_Printf( "FS_FOpenFileWrite: %s\n", ospath ); } + FS_FilenameIsExecutable( ospath, __FUNCTION__ ); + if( FS_CreatePath( ospath ) ) { return 0; } @@ -884,6 +916,8 @@ fileHandle_t FS_FOpenFileAppend( const char *filename ) { Com_Printf( "FS_FOpenFileAppend: %s\n", ospath ); } + FS_FilenameIsExecutable( ospath, __FUNCTION__ ); + if( FS_CreatePath( ospath ) ) { return 0; } @@ -3397,7 +3431,7 @@ int FS_FOpenFileByMode( const char *qpath, fileHandle_t *f, fsMode_t mode ) { } break; default: - Com_Error( ERR_FATAL, "FSH_FOpenFile: bad mode" ); + Com_Error( ERR_FATAL, "FS_FOpenFileByMode: bad mode" ); return -1; } diff --git a/code/renderer/tr_bsp.c b/code/renderer/tr_bsp.c index c340e13..72e88f3 100644 --- a/code/renderer/tr_bsp.c +++ b/code/renderer/tr_bsp.c @@ -1321,6 +1321,9 @@ static void R_LoadSubmodels( lump_t *l ) { model = R_AllocModel(); assert( model != NULL ); // this should never happen + if ( model == NULL ) { + ri.Error(ERR_DROP, "R_LoadSubmodels: R_AllocModel() failed"); + } model->type = MOD_BRUSH; model->bmodel = out; diff --git a/code/renderer/tr_local.h b/code/renderer/tr_local.h index 52a9e37..0da894e 100644 --- a/code/renderer/tr_local.h +++ b/code/renderer/tr_local.h @@ -322,10 +322,12 @@ typedef struct { struct shaderCommands_s; -#define LIGHTMAP_2D -4 // shader is for 2D rendering -#define LIGHTMAP_BY_VERTEX -3 // pre-lit triangle models -#define LIGHTMAP_WHITEIMAGE -2 -#define LIGHTMAP_NONE -1 +// any change in the LIGHTMAP_* defines here MUST be reflected in +// R_FindShader() in tr_bsp.c +#define LIGHTMAP_2D -4 // shader is for 2D rendering +#define LIGHTMAP_BY_VERTEX -3 // pre-lit triangle models +#define LIGHTMAP_WHITEIMAGE -2 +#define LIGHTMAP_NONE -1 typedef enum { CT_FRONT_SIDED, diff --git a/code/renderer/tr_shader.c b/code/renderer/tr_shader.c index a714873..7a44d35 100644 --- a/code/renderer/tr_shader.c +++ b/code/renderer/tr_shader.c @@ -1432,7 +1432,6 @@ static qboolean ParseShader( char **text ) // stage definition else if ( token[0] == '{' ) { - // 20051019 misantropia -- fix buffer overrun. if ( s >= MAX_SHADER_STAGES ) { ri.Printf( PRINT_WARNING, "WARNING: too many stages in shader %s\n", shader.name ); return qfalse; @@ -2447,6 +2446,10 @@ shader_t *R_FindShader( const char *name, int lightmapIndex, qboolean mipRawImag // lightmaps if ( lightmapIndex >= 0 && lightmapIndex >= tr.numLightmaps ) { lightmapIndex = LIGHTMAP_BY_VERTEX; + } else if ( lightmapIndex < LIGHTMAP_2D ) { + // negative lightmap indexes cause stray pointers (think tr.lightmaps[lightmapIndex]) + ri.Printf( PRINT_WARNING, "WARNING: shader '%s' has invalid lightmap index of %d\n", name, lightmapIndex ); + lightmapIndex = LIGHTMAP_BY_VERTEX; } COM_StripExtension(name, strippedName, sizeof(strippedName)); @@ -2581,7 +2584,7 @@ qhandle_t RE_RegisterShaderFromImage(const char *name, int lightmapIndex, image_ hash = generateHashValue(name, FILE_HASH_SIZE); - // 20051020 misantropia -- probably not necessary since this function + // probably not necessary since this function // only gets called from tr_font.c with lightmapIndex == LIGHTMAP_2D // but better safe than sorry. if ( lightmapIndex >= tr.numLightmaps ) { diff --git a/code/sdl/sdl_input.c b/code/sdl/sdl_input.c index f3f8ccc..93e60e6 100644 --- a/code/sdl/sdl_input.c +++ b/code/sdl/sdl_input.c @@ -136,7 +136,8 @@ static const char *IN_TranslateSDLToQ3Key(SDL_keysym *keysym, int *key) case SDLK_RCTRL: *key = K_CTRL; break; case SDLK_RMETA: - case SDLK_LMETA: + case SDLK_LMETA: *key = K_COMMAND; break; + case SDLK_RALT: case SDLK_LALT: *key = K_ALT; break; @@ -288,18 +289,17 @@ static void IN_ActivateMouse( void ) if( !mouseActive ) { - SDL_WM_GrabInput( SDL_GRAB_ON ); SDL_ShowCursor( 0 ); - #ifdef MACOS_X_CURSOR_HACK // This is a bug in the current SDL/macosx...have to toggle it a few // times to get the cursor to hide. SDL_ShowCursor( 1 ); SDL_ShowCursor( 0 ); #endif + SDL_WM_GrabInput( SDL_GRAB_ON ); } - // in_nograb makes no sense unless fullscreen + // in_nograb makes no sense in fullscreen mode if( !r_fullscreen->integer ) { if( in_nograb->modified || !mouseActive ) @@ -347,8 +347,9 @@ static void IN_DeactivateMouse( void ) if( mouseActive ) { - SDL_ShowCursor( 1 ); SDL_WM_GrabInput( SDL_GRAB_OFF ); + SDL_WarpMouse( glConfig.vidWidth >> 1, glConfig.vidHeight >> 1 ); + SDL_ShowCursor( 1 ); mouseActive = qfalse; } @@ -719,6 +720,15 @@ static void IN_ProcessEvents( void ) } break; + case SDL_ACTIVEEVENT: + if( e.active.state == SDL_APPINPUTFOCUS ) { + if( e.active.gain ) + IN_ActivateMouse(); + else + IN_DeactivateMouse(); + } + break; + case SDL_QUIT: Sys_Quit(); break; @@ -741,8 +751,10 @@ void IN_Frame (void) { IN_JoyMove( ); - // Release the mouse if the console if down and we're windowed - if( ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) && !r_fullscreen->integer ) + // Release the mouse if the console is down in windowed mode + // or if the window loses focus due to task switching + if( ( ( Key_GetCatcher( ) & KEYCATCH_CONSOLE ) && !r_fullscreen->integer ) || + !( SDL_GetAppState() & SDL_APPINPUTFOCUS ) ) IN_DeactivateMouse( ); else IN_ActivateMouse( ); diff --git a/code/server/sv_ccmds.c b/code/server/sv_ccmds.c index ad49334..07a3b44 100644 --- a/code/server/sv_ccmds.c +++ b/code/server/sv_ccmds.c @@ -966,7 +966,7 @@ static void SV_ConSay_f(void) { strcat(text, p); - SV_SendServerCommand(NULL, "chat \"%s\n\"", text); + SV_SendServerCommand(NULL, "chat \"%s\"", text); } diff --git a/code/tools/asm/q3asm.c b/code/tools/asm/q3asm.c index 769b46d..8b2e183 100644 --- a/code/tools/asm/q3asm.c +++ b/code/tools/asm/q3asm.c @@ -131,7 +131,7 @@ typedef enum { DATASEG, // initialized 32 bit data, will be byte swapped LITSEG, // strings BSSSEG, // 0 filled - JTRGSEG, // psuedo-segment that contains only jump table targets + JTRGSEG, // pseudo-segment that contains only jump table targets NUM_SEGMENTS } segmentName_t; @@ -226,16 +226,14 @@ int opcodesHash[ NUM_SOURCE_OPS ]; -int -vreport (const char* fmt, va_list vp) +static int vreport (const char* fmt, va_list vp) { if (options.verbose != qtrue) return 0; return vprintf(fmt, vp); } -int -report (const char *fmt, ...) +static int report (const char *fmt, ...) { va_list va; int retval; @@ -248,16 +246,14 @@ report (const char *fmt, ...) /* The chain-and-bucket hash table. -PH */ -void -hashtable_init (hashtable_t *H, int buckets) +static void hashtable_init (hashtable_t *H, int buckets) { H->buckets = buckets; H->table = calloc(H->buckets, sizeof(*(H->table))); return; } -hashtable_t * -hashtable_new (int buckets) +static hashtable_t *hashtable_new (int buckets) { hashtable_t *H; @@ -268,8 +264,7 @@ hashtable_new (int buckets) /* No destroy/destructor. No need. */ -void -hashtable_add (hashtable_t *H, int hashvalue, void *datum) +static void hashtable_add (hashtable_t *H, int hashvalue, void *datum) { hashchain_t *hc, **hb; @@ -293,15 +288,13 @@ hashtable_add (hashtable_t *H, int hashvalue, void *datum) return; } -hashchain_t * -hashtable_get (hashtable_t *H, int hashvalue) +static hashchain_t *hashtable_get (hashtable_t *H, int hashvalue) { hashvalue = (abs(hashvalue) % H->buckets); return (H->table[hashvalue]); } -void -hashtable_stats (hashtable_t *H) +static void hashtable_stats (hashtable_t *H) { int len, empties, longest, nodes; int i; @@ -341,8 +334,7 @@ hashtable_stats (hashtable_t *H) /* Kludge. */ /* Check if symbol already exists. */ /* Returns 0 if symbol does NOT already exist, non-zero otherwise. */ -int -hashtable_symbol_exists (hashtable_t *H, int hash, char *sym) +static int hashtable_symbol_exists (hashtable_t *H, int hash, char *sym) { hashchain_t *hc; symbol_t *s; @@ -372,8 +364,7 @@ hashtable_symbol_exists (hashtable_t *H, int hash, char *sym) /* Comparator function for quicksorting. */ -int -symlist_cmp (const void *e1, const void *e2) +static int symlist_cmp (const void *e1, const void *e2) { const symbol_t *a, *b; @@ -389,8 +380,7 @@ symlist_cmp (const void *e1, const void *e2) However, qsort(3) already exists, and I'm really lazy. -PH */ -void -sort_symbols () +static void sort_symbols () { int i, elems; symbol_t *s; @@ -439,7 +429,7 @@ sort_symbols () This function is one big evil hack to work around this problem. */ -int atoiNoCap (const char *s) +static int atoiNoCap (const char *s) { INT64 l; union { @@ -465,7 +455,7 @@ HashString ============= */ /* Default hash function of Kazlib 1.19, slightly modified. */ -unsigned int HashString (const char *key) +static unsigned int HashString (const char *key) { static unsigned long randbox[] = { 0x49848f1bU, 0xe6255dbaU, 0x36da5bdcU, 0x47bf94e9U, @@ -494,7 +484,7 @@ unsigned int HashString (const char *key) CodeError ============ */ -void CodeError( char *fmt, ... ) { +static void CodeError( char *fmt, ... ) { va_list argptr; errorCount++; @@ -511,7 +501,7 @@ void CodeError( char *fmt, ... ) { EmitByte ============ */ -void EmitByte( segment_t *seg, int v ) { +static void EmitByte( segment_t *seg, int v ) { if ( seg->imageUsed >= MAX_IMAGE ) { Error( "MAX_IMAGE" ); } @@ -524,7 +514,7 @@ void EmitByte( segment_t *seg, int v ) { EmitInt ============ */ -void EmitInt( segment_t *seg, int v ) { +static void EmitInt( segment_t *seg, int v ) { if ( seg->imageUsed >= MAX_IMAGE - 4) { Error( "MAX_IMAGE" ); } @@ -542,7 +532,7 @@ DefineSymbol Symbols can only be defined on pass 0 ============ */ -void DefineSymbol( char *sym, int value ) { +static void DefineSymbol( char *sym, int value ) { /* Hand optimization by PhaethonH */ symbol_t *s; char expanded[MAX_LINE_LENGTH]; @@ -598,7 +588,7 @@ LookupSymbol Symbols can only be evaluated on pass 1 ============ */ -int LookupSymbol( char *sym ) { +static int LookupSymbol( char *sym ) { symbol_t *s; char expanded[MAX_LINE_LENGTH]; int hash; @@ -646,7 +636,7 @@ If a full line isn't parsed, returns NULL Otherwise returns the updated parse pointer =============== */ -char *ExtractLine( char *data ) { +static char *ExtractLine( char *data ) { /* Goal: Given a string `data', extract one text line into buffer `lineBuffer' that is no longer than MAX_LINE_LENGTH characters long. Return value is @@ -688,7 +678,7 @@ Parse Parse a token out of linebuffer ============== */ -qboolean Parse( void ) { +static qboolean Parse( void ) { /* Hand-optimized by PhaethonH */ const char *p, *q; @@ -724,7 +714,7 @@ qboolean Parse( void ) { ParseValue ============== */ -int ParseValue( void ) { +static int ParseValue( void ) { Parse(); return atoiNoCap( token ); } @@ -735,7 +725,7 @@ int ParseValue( void ) { ParseExpression ============== */ -int ParseExpression(void) { +static int ParseExpression(void) { /* Hand optimization, PhaethonH */ int i, j; char sym[MAX_LINE_LENGTH]; @@ -806,7 +796,7 @@ Note that the lit segment is read-write in the VM, so strings aren't read only as in some architectures. ============== */ -void HackToSegment( segmentName_t seg ) { +static void HackToSegment( segmentName_t seg ) { if ( currentSegment == &segment[seg] ) { return; } @@ -1165,7 +1155,7 @@ AssembleLine ============== */ -void AssembleLine( void ) { +static void AssembleLine( void ) { hashchain_t *hc; sourceOps_t *op; int i; @@ -1320,7 +1310,7 @@ void InitTables( void ) { WriteMapFile ============== */ -void WriteMapFile( void ) { +static void WriteMapFile( void ) { FILE *f; symbol_t *s; char imageName[MAX_OS_PATH]; @@ -1352,7 +1342,7 @@ void WriteMapFile( void ) { WriteVmFile =============== */ -void WriteVmFile( void ) { +static void WriteVmFile( void ) { char imageName[MAX_OS_PATH]; vmHeader_t header; FILE *f; @@ -1431,7 +1421,7 @@ void WriteVmFile( void ) { Assemble =============== */ -void Assemble( void ) { +static void Assemble( void ) { int i; char filename[MAX_OS_PATH]; char *ptr; @@ -1498,7 +1488,7 @@ ParseOptionFile ============= */ -void ParseOptionFile( const char *filename ) { +static void ParseOptionFile( const char *filename ) { char expanded[MAX_OS_PATH]; char *text, *text_p; @@ -1526,6 +1516,19 @@ void ParseOptionFile( const char *filename ) { } } +static void ShowHelp( char *argv0 ) { + Error("Usage: %s [OPTION]... [FILES]...\n\ +Assemble LCC bytecode assembly to Q3VM bytecode.\n\ +\n\ + -o OUTPUT Write assembled output to file OUTPUT.qvm\n\ + -f LISTFILE Read options and list of files to assemble from LISTFILE.q3asm\n\ + -b BUCKETS Set symbol hash table to BUCKETS buckets\n\ + -v Verbose compilation report\n\ + -vq3 Produce a qvm file compatible with Q3 1.32b\n\ + -h --help -? Show this help\n\ +", argv0); +} + /* ============== main @@ -1538,15 +1541,7 @@ int main( int argc, char **argv ) { // _chdir( "/quake3/jccode/cgame/lccout" ); // hack for vc profiler if ( argc < 2 ) { - Error("Usage: %s [OPTION]... [FILES]...\n\ -Assemble LCC bytecode assembly to Q3VM bytecode.\n\ -\n\ - -o OUTPUT Write assembled output to file OUTPUT.qvm\n\ - -f LISTFILE Read options and list of files to assemble from LISTFILE\n\ - -b BUCKETS Set symbol hash table to BUCKETS buckets\n\ - -v Verbose compilation report\n\ - -vq3 Produce a qvm file compatible with Q3 1.32b\n\ -", argv[0]); + ShowHelp( argv[0] ); } start = I_FloatTime (); @@ -1559,6 +1554,12 @@ Assemble LCC bytecode assembly to Q3VM bytecode.\n\ if ( argv[i][0] != '-' ) { break; } + if( !strcmp( argv[ i ], "-h" ) || + !strcmp( argv[ i ], "--help" ) || + !strcmp( argv[ i ], "-?") ) { + ShowHelp( argv[0] ); + } + if ( !strcmp( argv[i], "-o" ) ) { if ( i == argc - 1 ) { Error( "-o must preceed a filename" ); @@ -1615,6 +1616,10 @@ Motivation: not wanting to scrollback for pages to find asm error. asmFileNames[ numAsmFiles ] = copystring( argv[ i ] ); numAsmFiles++; } + // In some case it Segfault without this check + if ( numAsmFiles == 0 ) { + Error( "No file to assemble\n" ); + } InitTables(); Assemble(); diff --git a/code/tools/lcc/cpp/cpp.c b/code/tools/lcc/cpp/cpp.c index 6739e4d..1fcffbc 100644 --- a/code/tools/lcc/cpp/cpp.c +++ b/code/tools/lcc/cpp/cpp.c @@ -204,9 +204,14 @@ control(Tokenrow *trp) error(WARNING, "Syntax error in #endif"); break; + case KWARNING: + trp->tp = tp+1; + error(WARNING, "#warning directive: %r", trp); + break; + case KERROR: trp->tp = tp+1; - error(WARNING, "#error directive: %r", trp); + error(ERROR, "#error directive: %r", trp); break; case KLINE: diff --git a/code/tools/lcc/cpp/cpp.h b/code/tools/lcc/cpp/cpp.h index ae855c9..87871d9 100644 --- a/code/tools/lcc/cpp/cpp.h +++ b/code/tools/lcc/cpp/cpp.h @@ -24,7 +24,7 @@ enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP, DSHARP1, NAME1, DEFINED, UMINUS }; enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE, - KUNDEF, KLINE, KERROR, KPRAGMA, KDEFINED, + KUNDEF, KLINE, KWARNING, KERROR, KPRAGMA, KDEFINED, KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL }; #define ISDEFINED 01 /* has #defined value */ diff --git a/code/tools/lcc/cpp/nlist.c b/code/tools/lcc/cpp/nlist.c index d76df86..d3a8357 100644 --- a/code/tools/lcc/cpp/nlist.c +++ b/code/tools/lcc/cpp/nlist.c @@ -29,6 +29,7 @@ struct kwtab { {"define", KDEFINE, ISKW}, {"undef", KUNDEF, ISKW}, {"line", KLINE, ISKW}, + {"warning", KWARNING, ISKW}, {"error", KERROR, ISKW}, {"pragma", KPRAGMA, ISKW}, {"eval", KEVAL, ISKW}, -- cgit v1.2.3