]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
cmd: Fix double free/use-after-free bugs in defer. Fixed infinite loop in defer cmd...
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 34ed652524c4e788fb4850cc0e50ff989579c076..3bedf6b042721c0c07c59838981e5c1c97901b97 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -1212,7 +1212,7 @@ static qboolean FS_AddPack_Fullpath(const char *pakfile, const char *shortname,
        }
        else
        {
-               Con_Errorf("unable to load pak \"%s\"\n", pakfile);
+               Con_Printf(CON_ERROR "unable to load pak \"%s\"\n", pakfile);
                return false;
        }
 }
@@ -2101,13 +2101,13 @@ static void FS_Init_Dir (void)
 
        p = FS_CheckGameDir(gamedirname1);
        if(!p || p == fs_checkgamedir_missing)
-               Con_Warnf("WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname1);
+               Con_Printf(CON_WARN "WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname1);
 
        if(gamedirname2)
        {
                p = FS_CheckGameDir(gamedirname2);
                if(!p || p == fs_checkgamedir_missing)
-                       Con_Warnf("WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname2);
+                       Con_Printf(CON_WARN "WARNING: base gamedir %s%s/ not found!\n", fs_basedir, gamedirname2);
        }
 
        // -game <gamedir>
@@ -2122,9 +2122,9 @@ static void FS_Init_Dir (void)
                        i++;
                        p = FS_CheckGameDir(sys.argv[i]);
                        if(!p)
-                               Sys_Error("Nasty -game name rejected: %s", sys.argv[i]);
+                               Con_Printf("WARNING: Nasty -game name rejected: %s\n", sys.argv[i]);
                        if(p == fs_checkgamedir_missing)
-                               Con_Warnf("WARNING: -game %s%s/ not found!\n", fs_basedir, sys.argv[i]);
+                               Con_Printf(CON_WARN "WARNING: -game %s%s/ not found!\n", fs_basedir, sys.argv[i]);
                        // add the gamedir to the list of active gamedirs
                        strlcpy (fs_gamedirs[fs_numgamedirs], sys.argv[i], sizeof(fs_gamedirs[fs_numgamedirs]));
                        fs_numgamedirs++;
@@ -2250,7 +2250,7 @@ static filedesc_t FS_SysOpenFiledesc(const char *filepath, const char *mode, qbo
                        opt = O_CREAT | O_APPEND;
                        break;
                default:
-                       Con_Errorf ("FS_SysOpen(%s, %s): invalid mode\n", filepath, mode);
+                       Con_Printf(CON_ERROR "FS_SysOpen(%s, %s): invalid mode\n", filepath, mode);
                        return FILEDESC_INVALID;
        }
        for (ind = 1; mode[ind] != '\0'; ind++)
@@ -2267,7 +2267,7 @@ static filedesc_t FS_SysOpenFiledesc(const char *filepath, const char *mode, qbo
                                dolock = true;
                                break;
                        default:
-                               Con_Errorf ("FS_SysOpen(%s, %s): unknown character in mode (%c)\n",
+                               Con_Printf(CON_ERROR "FS_SysOpen(%s, %s): unknown character in mode (%c)\n",
                                                        filepath, mode, mode[ind]);
                }
        }
@@ -2377,7 +2377,7 @@ static qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind)
        // No Zlib DLL = no compressed files
        if (!zlib_dll && (pfile->flags & PACKFILE_FLAG_DEFLATED))
        {
-               Con_Warnf("WARNING: can't open the compressed file %s\n"
+               Con_Printf(CON_WARN "WARNING: can't open the compressed file %s\n"
                                        "You need the Zlib DLL to use compressed files\n",
                                        pfile->name);
                return NULL;
@@ -2849,7 +2849,7 @@ fs_offset_t FS_Write (qfile_t* file, const void* data, size_t datasize)
        {
                if (FILEDESC_SEEK (file->handle, file->buff_ind - file->buff_len, SEEK_CUR) == -1)
                {
-                       Con_Warnf("WARNING: could not seek in %s.\n", file->filename);
+                       Con_Printf(CON_WARN "WARNING: could not seek in %s.\n", file->filename);
                }
        }
 
@@ -2891,7 +2891,7 @@ fs_offset_t FS_Read (qfile_t* file, void* buffer, size_t buffersize)
 {
        fs_offset_t count, done;
 
-       if (buffersize == 0)
+       if (buffersize == 0 || !buffer)
                return 0;
 
        // Get rid of the ungetc character
@@ -3570,7 +3570,7 @@ FS_Search
 Allocate and fill a search structure with information on matching filenames.
 ===========
 */
-fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
+fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet, const char *packfile)
 {
        fssearch_t *search;
        searchpath_t *searchpath;
@@ -3578,7 +3578,8 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
        int i, basepathlength, numfiles, numchars, resultlistindex, dirlistindex;
        stringlist_t resultlist;
        stringlist_t dirlist;
-       const char *slash, *backslash, *colon, *separator;
+       stringlist_t matchedSet, foundSet;
+       const char *start, *slash, *backslash, *colon, *separator;
        char *basepath;
 
        for (i = 0;pattern[i] == '.' || pattern[i] == ':' || pattern[i] == '/' || pattern[i] == '\\';i++)
@@ -3612,6 +3613,11 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
                {
                        // look through all the pak file elements
                        pak = searchpath->pack;
+                       if(packfile)
+                       {
+                               if(strcmp(packfile, pak->shortname))
+                                       continue;
+                       }
                        for (i = 0;i < pak->numfiles;i++)
                        {
                                char temp[MAX_OSPATH];
@@ -3648,8 +3654,10 @@ fssearch_t *FS_Search(const char *pattern, int caseinsensitive, int quiet)
                }
                else
                {
-                       stringlist_t matchedSet, foundSet;
-                       const char *start = pattern;
+                       if(packfile)
+                               continue;
+
+                       start = pattern;
 
                        stringlistinit(&matchedSet);
                        stringlistinit(&foundSet);
@@ -3786,7 +3794,7 @@ static int FS_ListDirectory(const char *pattern, int oneperline)
        const char *name;
        char linebuf[MAX_INPUTLINE];
        fssearch_t *search;
-       search = FS_Search(pattern, true, true);
+       search = FS_Search(pattern, true, true, NULL);
        if (!search)
                return 0;
        numfiles = search->numfilenames;