]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
make color averaging use 64bit integers, instead of 32bit ones, as they wrap on 512x5...
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 7a80304defc4f17b6d1bc1c599016e779ae308b2..12dfc317ccdb46d6ef591b0101ed2f3281077eb9 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -472,7 +472,11 @@ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd)
        // Load the central directory in memory
        central_dir = (unsigned char *)Mem_Alloc (tempmempool, eocd->cdir_size);
        lseek (pack->handle, eocd->cdir_offset, SEEK_SET);
-       read (pack->handle, central_dir, eocd->cdir_size);
+       if(read (pack->handle, central_dir, eocd->cdir_size) != (ssize_t) eocd->cdir_size)
+       {
+               Mem_Free (central_dir);
+               return -1;
+       }
 
        // Extract the files properties
        // The parsing is done "by hand" because some fields have variable sizes and
@@ -741,7 +745,7 @@ static packfile_t* FS_AddFileToPack (const char* name, pack_t* pack,
 ============
 FS_CreatePath
 
-Only used for FS_Open.
+Only used for FS_OpenRealFile.
 ============
 */
 void FS_CreatePath (char *path)
@@ -808,7 +812,12 @@ pack_t *FS_LoadPackPAK (const char *packfile)
 #endif
        if (packhandle < 0)
                return NULL;
-       read (packhandle, (void *)&header, sizeof(header));
+       if(read (packhandle, (void *)&header, sizeof(header)) != sizeof(header))
+       {
+               Con_Printf ("%s is not a packfile\n", packfile);
+               close(packhandle);
+               return NULL;
+       }
        if (memcmp(header.id, "PACK", 4))
        {
                Con_Printf ("%s is not a packfile\n", packfile);
@@ -1982,35 +1991,48 @@ MAIN PUBLIC FUNCTIONS
 
 /*
 ====================
-FS_Open
+FS_OpenRealFile
 
-Open a file. The syntax is the same as fopen
+Open a file in the userpath. The syntax is the same as fopen
+Used for savegame scanning in menu, and all file writing.
 ====================
 */
-qfile_t* FS_Open (const char* filepath, const char* mode, qboolean quiet, qboolean nonblocking)
+qfile_t* FS_OpenRealFile (const char* filepath, const char* mode, qboolean quiet)
 {
+       char real_path [MAX_OSPATH];
+
        if (FS_CheckNastyPath(filepath, false))
        {
-               Con_Printf("FS_Open(\"%s\", \"%s\", %s): nasty filename rejected\n", filepath, mode, quiet ? "true" : "false");
+               Con_Printf("FS_OpenRealFile(\"%s\", \"%s\", %s): nasty filename rejected\n", filepath, mode, quiet ? "true" : "false");
                return NULL;
        }
 
-       // If the file is opened in "write", "append", or "read/write" mode
+       dpsnprintf (real_path, sizeof (real_path), "%s/%s", fs_gamedir, filepath);
+
+       // If the file is opened in "write", "append", or "read/write" mode,
+       // create directories up to the file.
        if (mode[0] == 'w' || mode[0] == 'a' || strchr (mode, '+'))
-       {
-               char real_path [MAX_OSPATH];
+               FS_CreatePath (real_path);
+       return FS_SysOpen (real_path, mode, false);
+}
 
-               // Open the file on disk directly
-               dpsnprintf (real_path, sizeof (real_path), "%s/%s", fs_gamedir, filepath);
 
-               // Create directories up to the file
-               FS_CreatePath (real_path);
+/*
+====================
+FS_OpenVirtualFile
 
-               return FS_SysOpen (real_path, mode, nonblocking);
+Open a file. The syntax is the same as fopen
+====================
+*/
+qfile_t* FS_OpenVirtualFile (const char* filepath, qboolean quiet)
+{
+       if (FS_CheckNastyPath(filepath, false))
+       {
+               Con_Printf("FS_OpenVirtualFile(\"%s\", %s): nasty filename rejected\n", filepath, quiet ? "true" : "false");
+               return NULL;
        }
-       // Else, we look at the various search paths and open the file in read-only mode
-       else
-               return FS_OpenReadFile (filepath, quiet, nonblocking, 16);
+
+       return FS_OpenReadFile (filepath, quiet, false, 16);
 }
 
 
@@ -2491,7 +2513,7 @@ unsigned char *FS_LoadFile (const char *path, mempool_t *pool, qboolean quiet, f
        unsigned char *buf = NULL;
        fs_offset_t filesize = 0;
 
-       file = FS_Open (path, "rb", quiet, false);
+       file = FS_OpenVirtualFile(path, quiet);
        if (file)
        {
                filesize = file->real_length;
@@ -2520,7 +2542,7 @@ qboolean FS_WriteFile (const char *filename, void *data, fs_offset_t len)
 {
        qfile_t *file;
 
-       file = FS_Open (filename, "wb", false, false);
+       file = FS_OpenRealFile(filename, "wb", false);
        if (!file)
        {
                Con_Printf("FS_WriteFile: failed on %s\n", filename);