From ee188168c12188340961314e1dfc70a4f7ad4f7a Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 13 May 2026 19:14:59 +0200 Subject: [PATCH] [common] do not crash when don't have permissions to /tmp/eden directory due to unforessen circumstances (FreeBSD) (#3912) instead of throwing, use std::error_code and such due to reasons unberknownst to me, the UID of the /tmp/eden directory was set for another user, this inevitably caused a crash due to wrong permissions (which is a very user unfriendly thing to do generally) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3912 Reviewed-by: crueter --- src/frontend_common/data_manager.cpp | 6 +++--- src/qt_common/util/content.cpp | 10 ++++------ src/qt_common/util/mod.cpp | 11 ++++++----- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/frontend_common/data_manager.cpp b/src/frontend_common/data_manager.cpp index 280cbba4ab..e4e9a32ce1 100644 --- a/src/frontend_common/data_manager.cpp +++ b/src/frontend_common/data_manager.cpp @@ -46,10 +46,10 @@ const std::string GetDataDirString(DataDir dir, const std::string &user_id) u64 ClearDir(DataDir dir, const std::string &user_id) { fs::path data_dir = GetDataDir(dir, user_id); - u64 result = fs::remove_all(data_dir); - + std::error_code ec; + u64 result = fs::remove_all(data_dir, ec); // mkpath at the end just so it actually exists - fs::create_directories(data_dir); + fs::create_directories(data_dir, ec); return result; } diff --git a/src/qt_common/util/content.cpp b/src/qt_common/util/content.cpp index 4d9b324608..f705b3e00f 100644 --- a/src/qt_common/util/content.cpp +++ b/src/qt_common/util/content.cpp @@ -181,15 +181,13 @@ void InstallFirmware(const QString& location, bool recursive) { QString UnzipFirmwareToTmp(const QString& location) { namespace fs = std::filesystem; - fs::path tmp{fs::temp_directory_path()}; - - if (!fs::create_directories(tmp / "eden" / "firmware")) { + fs::path tmp{fs::temp_directory_path() / "eden" / "firmware"}; + std::error_code ec; + fs::remove_all(tmp, ec); + if (!fs::create_directories(tmp, ec)) { return QString(); } - tmp /= "eden"; - tmp /= "firmware"; - QString qCacheDir = QString::fromStdString(tmp.string()); QFile zip(location); diff --git a/src/qt_common/util/mod.cpp b/src/qt_common/util/mod.cpp index 4e7fd54e79..3e75cb21fa 100644 --- a/src/qt_common/util/mod.cpp +++ b/src/qt_common/util/mod.cpp @@ -83,8 +83,9 @@ QStringList GetModFolders(const QString& root, const QString& fallbackName) { // now make a temp directory... const auto mod_dir = fs::temp_directory_path() / "eden" / "mod" / name.toStdString(); const auto tmp = mod_dir / to_make; - fs::remove_all(mod_dir); - if (!fs::create_directories(tmp)) { + std::error_code ec; + fs::remove_all(mod_dir, ec); + if (!fs::create_directories(tmp, ec)) { LOG_ERROR(Frontend, "Failed to create temporary directory {}", tmp.string()); return {}; } @@ -116,9 +117,9 @@ QStringList GetModFolders(const QString& root, const QString& fallbackName) { const QString ExtractMod(const QString& path) { namespace fs = std::filesystem; fs::path tmp{fs::temp_directory_path() / "eden" / "unzip_mod"}; - - fs::remove_all(tmp); - if (!fs::create_directories(tmp)) { + std::error_code ec; + fs::remove_all(tmp, ec); + if (!fs::create_directories(tmp, ec)) { QtCommon::Frontend::Critical(tr("Mod Extract Failed"), tr("Failed to create temporary directory %1") .arg(QString::fromStdString(tmp.string())));