Remove access to the root FS from lua

On linux / is mounted to /rootfs in RageFile, which allows access to the
_whole_ filesystem from lua. This means themes and mod files can
re-write user data and extract files via USB profiles.

/rootfs was only added for internal use by the alsa, oss and memory card
drivers, so it can be easily replaced with direct fstream file access.
This commit is contained in:
Martin Natano
2022-02-06 15:31:31 +01:00
parent 2005713a32
commit 7d8ff85018
5 changed files with 32 additions and 31 deletions
-10
View File
@@ -386,16 +386,6 @@ RString ArchHooks_Unix::GetClipboard()
static LocalizedString COULDNT_FIND_SONGS( "ArchHooks_Unix", "Couldn't find 'Songs'" );
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{
#if defined(UNIX)
/* Mount the root filesystem, so we can read files in /proc, /etc, and so on.
* This is /rootfs, not /root, to avoid confusion with root's home directory. */
FILEMAN->Mount( "dir", "/", "/rootfs" );
/* Mount /proc, so Alsa9Buf::GetSoundCardDebugInfo() and others can access it.
* (Deprecated; use rootfs.) */
FILEMAN->Mount( "dir", "/proc", "/proc" );
#endif
RString Root;
struct stat st;
if( !stat(sDirOfExecutable + "/Packages", &st) && st.st_mode&S_IFDIR )
@@ -2,7 +2,6 @@
#include "MemoryCardDriverThreaded_Linux.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "RageFile.h"
#include "RageTimer.h"
#include <cerrno>
@@ -14,8 +13,11 @@
#include <dirent.h>
#endif
#include <cstring>
#include <fstream>
#include <limits.h>
#include <stdlib.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
@@ -286,29 +288,31 @@ void MemoryCardDriverThreaded_Linux::GetUSBStorageDevices( vector<UsbStorageDevi
// /dev/sda1 /mnt/flash1 auto noauto,owner 0 0
// /dev/sdb1 /mnt/flash2 auto noauto,owner 0 0
// /dev/sdc1 /mnt/flash3 auto noauto,owner 0 0
RString fn = "/rootfs/etc/fstab";
RageFile f;
if( !f.Open(fn) )
std::ifstream f("/etc/fstab");
if (f.fail())
{
LOG->Warn( "can't open '%s': %s", fn.c_str(), f.GetError().c_str() );
LOG->Warn( "can't open '/etc/fstab': %s", strerror(errno) );
return;
}
RString sLine;
while( !f.AtEOF() )
std::string line;
while( !f.eof() )
{
switch( f.GetLine(sLine) )
std::getline(f, line);
if (f.eof())
{
case 0: continue; /* eof */
case -1:
LOG->Warn( "error reading '%s': %s", fn.c_str(), f.GetError().c_str() );
continue;
}
else if (f.fail())
{
LOG->Warn( "error reading '/etc/fstab': %s", strerror(errno) );
return;
}
char szScsiDevice[1024];
char szMountPoint[1024];
int iRet = sscanf( sLine, "%s %s", szScsiDevice, szMountPoint );
int iRet = sscanf( line.c_str(), "%s %s", szScsiDevice, szMountPoint );
if( iRet != 2 || szScsiDevice[0] == '#')
continue; // don't process this line
+3 -1
View File
@@ -1,6 +1,7 @@
#include "global.h"
#include <dlfcn.h>
#include <sys/stat.h>
#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
@@ -28,7 +29,8 @@ RString LoadALSA()
* on use, and this would prevent that from happening. I don't know if anyone actually
* does that, though: they're often configured to load snd (the core module) if ALSA
* devices are accessed, but hardware drivers are typically loaded on boot. */
if( !IsADirectory("/rootfs/proc/asound/") )
struct stat st;
if (stat("/proc/asound/", &st) == -1 || !(st.st_mode & S_IFDIR))
return "/proc/asound/ does not exist";
ASSERT( Handle == nullptr );
+8 -4
View File
@@ -5,6 +5,9 @@
#include "ALSA9Dynamic.h"
#include "PrefsManager.h"
#include <fstream>
#include <string>
/* int err; must be defined before using this macro */
#define ALSA_CHECK(x) \
if ( err < 0 ) { LOG->Info("ALSA: %s: %s", x, dsnd_strerror(err)); return false; }
@@ -140,11 +143,12 @@ void Alsa9Buf::GetSoundCardDebugInfo()
return;
done = true;
if( DoesFileExist("/rootfs/proc/asound/version") )
std::ifstream f("/proc/asound/version");
if (f.good())
{
RString sVersion;
GetFileContents( "/rootfs/proc/asound/version", sVersion, true );
LOG->Info( "ALSA: %s", sVersion.c_str() );
std::string version;
std::getline(f, version);
LOG->Info( "ALSA: %s", version.c_str() );
}
InitializeErrorHandler();
+3 -2
View File
@@ -4,7 +4,6 @@
#include "RageLog.h"
#include "RageSound.h"
#include "RageSoundManager.h"
#include "RageUtil.h"
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
@@ -17,6 +16,7 @@
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <sys/select.h>
#include <sys/stat.h>
REGISTER_SOUND_DRIVER_CLASS( OSS );
@@ -138,7 +138,8 @@ RString RageSoundDriver_OSS::CheckOSSVersion( int fd )
*/
#ifndef FORCE_OSS
#define ALSA_SNDRV_OSS_VERSION ((3<<16)|(8<<8)|(1<<4)|(0))
if( version == ALSA_SNDRV_OSS_VERSION && IsADirectory("/rootfs/proc/asound") )
struct stat st;
if( version == ALSA_SNDRV_OSS_VERSION && stat("/proc/asound", &st) && (st.st_mode & S_IFDIR) )
return "RageSoundDriver_OSS: ALSA detected. ALSA OSS emulation is buggy; use ALSA natively.";
#endif
if( version )