From c99477f0463070aa5397a0e75252378d36c1f564 Mon Sep 17 00:00:00 2001 From: Martin Natano Date: Sun, 13 Mar 2022 15:50:59 +0100 Subject: [PATCH] Only make parts of the initial filesystem writable This prevents overwriting the program binary or other sentitive paths like /Data/Static.ini from Lua. --- src/StepMania.cpp | 2 +- src/arch/ArchHooks/ArchHooks_MacOSX.mm | 26 +++++++++++++++++--- src/arch/ArchHooks/ArchHooks_Unix.cpp | 26 +++++++++++++++++--- src/arch/ArchHooks/ArchHooks_Win32Static.cpp | 23 +++++++++++++++-- 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/StepMania.cpp b/src/StepMania.cpp index 518982c2d0..2c59a5c6ba 100644 --- a/src/StepMania.cpp +++ b/src/StepMania.cpp @@ -1006,7 +1006,7 @@ int sm_main(int argc, char* argv[]) FILEMAN = new RageFileManager( argv[0] ); FILEMAN->MountInitialFilesystems(); - bool bPortable = DoesFileExist("Portable.ini"); + bool bPortable = DoesFileExist("/Portable.ini"); if( !bPortable ) FILEMAN->MountUserFilesystems(); diff --git a/src/arch/ArchHooks/ArchHooks_MacOSX.mm b/src/arch/ArchHooks/ArchHooks_MacOSX.mm index 060ff5b5b2..75d3e9da11 100644 --- a/src/arch/ArchHooks/ArchHooks_MacOSX.mm +++ b/src/arch/ArchHooks/ArchHooks_MacOSX.mm @@ -7,7 +7,6 @@ #include "ProductInfo.h" #include #include -#include #include #include #include @@ -318,9 +317,28 @@ static void PathForFolderType( char dir[PATH_MAX], OSType folderType ) void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) { - struct stat st; - bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st); - FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/"); + FILEMAN->Mount("dirro", sDirOfExecutable, "/"); + + bool portable = DoesFileExist("/Portable.ini"); + if (portable) + { + FILEMAN->Mount("dir", sDirOfExecutable + "/Announcers", "/Announcers"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BGAnimations", "/BGAnimations"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BackgroundEffects", "/BackgroundEffects"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BackgroundTransitions", "/BackgroundTransitions"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Cache", "/Cache"); + FILEMAN->Mount("dir", sDirOfExecutable + "/CDTitles", "/CDTitles"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Characters", "/Characters"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Courses", "/Courses"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Logs", "/Logs"); + FILEMAN->Mount("dir", sDirOfExecutable + "/NoteSkins", "/NoteSkins"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Packages", "/Packages"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Save", "/Save"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Screenshots", "/Screenshots"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Songs", "/Songs"); + FILEMAN->Mount("dir", sDirOfExecutable + "/RandomMovies", "/RandomMovies"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Themes", "/Themes"); + } CFURLRef dataUrl = CFBundleCopyResourceURL( CFBundleGetMainBundle(), CFSTR("StepMania"), CFSTR("smzip"), nil); if( dataUrl ) diff --git a/src/arch/ArchHooks/ArchHooks_Unix.cpp b/src/arch/ArchHooks/ArchHooks_Unix.cpp index 24dbaf455a..c23d66aea7 100644 --- a/src/arch/ArchHooks/ArchHooks_Unix.cpp +++ b/src/arch/ArchHooks/ArchHooks_Unix.cpp @@ -15,7 +15,6 @@ #include #endif #include -#include #include #include @@ -383,9 +382,28 @@ RString ArchHooks_Unix::GetClipboard() void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) { - struct stat st; - bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st); - FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/"); + FILEMAN->Mount("dirro", sDirOfExecutable, "/"); + + bool portable = DoesFileExist("/Portable.ini"); + if (portable) + { + FILEMAN->Mount("dir", sDirOfExecutable + "/Announcers", "/Announcers"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BGAnimations", "/BGAnimations"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BackgroundEffects", "/BackgroundEffects"); + FILEMAN->Mount("dir", sDirOfExecutable + "/BackgroundTransitions", "/BackgroundTransitions"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Cache", "/Cache"); + FILEMAN->Mount("dir", sDirOfExecutable + "/CDTitles", "/CDTitles"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Characters", "/Characters"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Courses", "/Courses"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Logs", "/Logs"); + FILEMAN->Mount("dir", sDirOfExecutable + "/NoteSkins", "/NoteSkins"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Packages", "/Packages"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Save", "/Save"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Screenshots", "/Screenshots"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Songs", "/Songs"); + FILEMAN->Mount("dir", sDirOfExecutable + "/RandomMovies", "/RandomMovies"); + FILEMAN->Mount("dir", sDirOfExecutable + "/Themes", "/Themes"); + } } void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable ) diff --git a/src/arch/ArchHooks/ArchHooks_Win32Static.cpp b/src/arch/ArchHooks/ArchHooks_Win32Static.cpp index c07ac0085f..897a3cc283 100644 --- a/src/arch/ArchHooks/ArchHooks_Win32Static.cpp +++ b/src/arch/ArchHooks/ArchHooks_Win32Static.cpp @@ -55,9 +55,28 @@ static RString GetMountDir( const RString &sDirOfExecutable ) void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) { RString sDir = GetMountDir( sDirOfExecutable ); + FILEMAN->Mount("dirro", sDir, "/"); - bool portable = GetFileAttributes(sDir + "/Portable.ini", &st) != INVALID_FILE_ATTRIBUTES; - FILEMAN->Mount(portable ? "dir" : "dirro", sDir, "/"); + bool portable = DoesFileExist("/Portable.ini"); + if (portable) + { + FILEMAN->Mount("dir", sDir + "/Announcers", "/Announcers"); + FILEMAN->Mount("dir", sDir + "/BGAnimations", "/BGAnimations"); + FILEMAN->Mount("dir", sDir + "/BackgroundEffects", "/BackgroundEffects"); + FILEMAN->Mount("dir", sDir + "/BackgroundTransitions", "/BackgroundTransitions"); + FILEMAN->Mount("dir", sDir + "/Cache", "/Cache"); + FILEMAN->Mount("dir", sDir + "/CDTitles", "/CDTitles"); + FILEMAN->Mount("dir", sDir + "/Characters", "/Characters"); + FILEMAN->Mount("dir", sDir + "/Courses", "/Courses"); + FILEMAN->Mount("dir", sDir + "/Logs", "/Logs"); + FILEMAN->Mount("dir", sDir + "/NoteSkins", "/NoteSkins"); + FILEMAN->Mount("dir", sDir + "/Packages", "/Packages"); + FILEMAN->Mount("dir", sDir + "/Save", "/Save"); + FILEMAN->Mount("dir", sDir + "/Screenshots", "/Screenshots"); + FILEMAN->Mount("dir", sDir + "/Songs", "/Songs"); + FILEMAN->Mount("dir", sDir + "/RandomMovies", "/RandomMovies"); + FILEMAN->Mount("dir", sDir + "/Themes", "/Themes"); + } } void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )