Skip to content

Commit

Permalink
Fix crash when trying to open unreadable IWAD files
Browse files Browse the repository at this point in the history
  • Loading branch information
Cacodemon345 authored and coelckers committed Feb 12, 2021
1 parent 0a30c19 commit 349a2e9
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
17 changes: 17 additions & 0 deletions src/common/utility/cmdlib.cpp
Expand Up @@ -165,6 +165,23 @@ bool FileExists (const char *filename)
return res && !isdir;
}

//==========================================================================
//
// FileReadable
//
// Returns true if the file can be read.
//
//==========================================================================

bool FileReadable(const char *filename)
{
#ifndef _WIN32
return access (filename, R_OK) == 0;
#else
return _access (filename, 4) == 0;
#endif
}

//==========================================================================
//
// DirExists
Expand Down
1 change: 1 addition & 0 deletions src/common/utility/cmdlib.h
Expand Up @@ -33,6 +33,7 @@ char(&_ArraySizeHelper(T(&array)[N]))[N];
#define myoffsetof(type,identifier) ((size_t)&((type *)alignof(type))->identifier - alignof(type))

bool FileExists (const char *filename);
bool FileReadable (const char *filename);
bool DirExists(const char *filename);
bool DirEntryExists (const char *pathname, bool *isdir = nullptr);
bool GetFileInfo(const char* pathname, size_t* size, time_t* time);
Expand Down
4 changes: 2 additions & 2 deletions src/d_iwad.cpp
Expand Up @@ -577,10 +577,10 @@ int FIWadManager::IdentifyVersion (TArray<FString> &wadfiles, const char *iwad,
// -iwad not found or not specified. Revert back to standard behavior.
if (mFoundWads.Size() == numFoundWads) iwadparm = nullptr;

// Check for symbolic links leading to non-existent files.
// Check for symbolic links leading to non-existent files and for files that are unreadable.
for (unsigned int i = 0; i < mFoundWads.Size(); i++)
{
if (!FileExists(mFoundWads[i].mFullPath)) mFoundWads.Delete(i);
if (!FileExists(mFoundWads[i].mFullPath) || !FileReadable(mFoundWads[i].mFullPath)) mFoundWads.Delete(i);
}

// Now check if what got collected actually is an IWAD.
Expand Down

0 comments on commit 349a2e9

Please sign in to comment.