From 8d42bdaf6b9f2dbca8c43d770eae3ea7579e8754 Mon Sep 17 00:00:00 2001 From: Dylan Schooner Date: Thu, 30 Oct 2025 03:15:14 -0400 Subject: [PATCH] Check return value of 'virtual bool QFile::open(QIODeviceBase::OpenMode)' Signed-off-by: Dylan Schooner --- launcher/Application.cpp | 4 ++- launcher/FileSystem.cpp | 5 ++- .../modplatform/helpers/OverrideUtils.cpp | 10 ++++-- .../legacy_ftb/PackInstallTask.cpp | 36 ++++++++++--------- launcher/net/HttpMetaCache.cpp | 5 ++- launcher/ui/dialogs/AboutDialog.cpp | 11 ++++-- tests/Library_test.cpp | 5 ++- tests/MojangVersionFormat_test.cpp | 10 ++++-- tests/Version_test.cpp | 5 ++- 9 files changed, 63 insertions(+), 28 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index dbf55f425..2570beb3c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1968,7 +1968,9 @@ bool Application::handleDataMigration(const QString& currentData, auto setDoNotMigrate = [&nomigratePath] { QFile file(nomigratePath); - file.open(QIODevice::WriteOnly); + if (!file.open(QIODevice::WriteOnly)) { + qWarning() << "setDoNotMigrate failed; Failed to open file '" << file.fileName() << "' for writing!"; + } }; // create no-migrate file if user doesn't want to migrate diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index e987fa59a..1ace331ce 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -1002,7 +1002,10 @@ QString createShortcut(QString destination, QString target, QStringList args, QS if (!destination.endsWith(".desktop")) // in case of isFlatpak destination is already populated destination += ".desktop"; QFile f(destination); - f.open(QIODevice::WriteOnly | QIODevice::Text); + if (!f.open(QIODevice::WriteOnly | QIODevice::Text)) { + qWarning() << "Failed to open file '" << f.fileName() << "' for writing!"; + return QString(); + } QTextStream stream(&f); auto argstring = quoteArgs(args, "'", "'\\''"); diff --git a/launcher/modplatform/helpers/OverrideUtils.cpp b/launcher/modplatform/helpers/OverrideUtils.cpp index 60983a5cf..d5958a59d 100644 --- a/launcher/modplatform/helpers/OverrideUtils.cpp +++ b/launcher/modplatform/helpers/OverrideUtils.cpp @@ -15,7 +15,10 @@ void createOverrides(const QString& name, const QString& parent_folder, const QS FS::ensureFilePathExists(file_path); QFile file(file_path); - file.open(QFile::WriteOnly); + if (!file.open(QFile::WriteOnly)) { + qWarning() << "Failed to open file '" << file.fileName() << "' for writing!"; + return; + } QDirIterator override_iterator(override_path, QDirIterator::Subdirectories); while (override_iterator.hasNext()) { @@ -43,7 +46,10 @@ QStringList readOverrides(const QString& name, const QString& parent_folder) QStringList previous_overrides; - file.open(QFile::ReadOnly); + if (!file.open(QFile::ReadOnly)) { + qWarning() << "Failed to open file '" << file.fileName() << "' for reading!"; + return previous_overrides; + } QString entry; do { diff --git a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp index 2b9bd127a..034ee3eae 100644 --- a/launcher/modplatform/legacy_ftb/PackInstallTask.cpp +++ b/launcher/modplatform/legacy_ftb/PackInstallTask.cpp @@ -153,25 +153,29 @@ void PackInstallTask::install() QFile packJson(m_stagingPath + "/minecraft/pack.json"); QDir jarmodDir = QDir(m_stagingPath + "/unzip/instMods"); if (packJson.exists()) { - packJson.open(QIODevice::ReadOnly | QIODevice::Text); - QJsonDocument doc = QJsonDocument::fromJson(packJson.readAll()); - packJson.close(); + if (packJson.open(QIODevice::ReadOnly | QIODevice::Text)) { + QJsonDocument doc = QJsonDocument::fromJson(packJson.readAll()); + packJson.close(); - // we only care about the libs - QJsonArray libs = doc.object().value("libraries").toArray(); + // we only care about the libs + QJsonArray libs = doc.object().value("libraries").toArray(); - for (const auto& value : libs) { - QString nameValue = value.toObject().value("name").toString(); - if (!nameValue.startsWith("net.minecraftforge")) { - continue; + for (const auto& value : libs) { + QString nameValue = value.toObject().value("name").toString(); + if (!nameValue.startsWith("net.minecraftforge")) { + continue; + } + + GradleSpecifier forgeVersion(nameValue); + + components->setComponentVersion("net.minecraftforge", + forgeVersion.version().replace(m_pack.mcVersion, "").replace("-", "")); + packJson.remove(); + fallback = false; + break; } - - GradleSpecifier forgeVersion(nameValue); - - components->setComponentVersion("net.minecraftforge", forgeVersion.version().replace(m_pack.mcVersion, "").replace("-", "")); - packJson.remove(); - fallback = false; - break; + } else { + qWarning() << "Failed to open file '" << packJson.fileName() << "' for reading!"; } } diff --git a/launcher/net/HttpMetaCache.cpp b/launcher/net/HttpMetaCache.cpp index 77c1de47d..b0b3b6533 100644 --- a/launcher/net/HttpMetaCache.cpp +++ b/launcher/net/HttpMetaCache.cpp @@ -112,7 +112,10 @@ auto HttpMetaCache::resolveEntry(QString base, QString resource_path, QString ex qint64 file_last_changed = finfo.lastModified().toUTC().toMSecsSinceEpoch(); if (file_last_changed != entry->m_local_changed_timestamp) { QFile input(real_path); - input.open(QIODevice::ReadOnly); + if (!input.open(QIODevice::ReadOnly)) { + qWarning() << "Failed to open file '" << input.fileName() << "' for reading!"; + return staleEntry(base, resource_path); + } QString md5sum = QCryptographicHash::hash(input.readAll(), QCryptographicHash::Md5).toHex().constData(); if (entry->m_md5sum != md5sum) { selected_base.entry_list.remove(resource_path); diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index 0f3067719..84d5f4fe2 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -124,9 +124,14 @@ QString getCreditsHtml() QString getLicenseHtml() { QFile dataFile(":/documents/COPYING.md"); - dataFile.open(QIODevice::ReadOnly); - QString output = markdownToHTML(dataFile.readAll()); - return output; + if (dataFile.open(QIODevice::ReadOnly)) { + QString output = markdownToHTML(dataFile.readAll()); + dataFile.close(); + return output; + } else { + qWarning() << "Failed to open file '" << dataFile.fileName() << "' for reading!"; + return QString(); + } } } // namespace diff --git a/tests/Library_test.cpp b/tests/Library_test.cpp index 9826abbdf..59bc90c0c 100644 --- a/tests/Library_test.cpp +++ b/tests/Library_test.cpp @@ -48,7 +48,10 @@ class LibraryTest : public QObject { LibraryPtr readMojangJson(const QString path) { QFile jsonFile(path); - jsonFile.open(QIODevice::ReadOnly); + if (!jsonFile.open(QIODevice::ReadOnly)) { + qCritical() << "Failed to open file '" << jsonFile.fileName() << "' for reading!"; + return LibraryPtr(); + } auto data = jsonFile.readAll(); jsonFile.close(); ProblemContainer problems; diff --git a/tests/MojangVersionFormat_test.cpp b/tests/MojangVersionFormat_test.cpp index 9ff5d78c0..3c8d3ffc5 100644 --- a/tests/MojangVersionFormat_test.cpp +++ b/tests/MojangVersionFormat_test.cpp @@ -9,7 +9,10 @@ class MojangVersionFormatTest : public QObject { static QJsonDocument readJson(const QString path) { QFile jsonFile(path); - jsonFile.open(QIODevice::ReadOnly); + if (!jsonFile.open(QIODevice::ReadOnly)) { + qWarning() << "Failed to open file '" << jsonFile.fileName() << "' for reading!"; + return QJsonDocument(); + } auto data = jsonFile.readAll(); jsonFile.close(); return QJsonDocument::fromJson(data); @@ -17,7 +20,10 @@ class MojangVersionFormatTest : public QObject { static void writeJson(const char* file, QJsonDocument doc) { QFile jsonFile(file); - jsonFile.open(QIODevice::WriteOnly | QIODevice::Text); + if (!jsonFile.open(QIODevice::WriteOnly | QIODevice::Text)) { + qCritical() << "Failed to open file '" << jsonFile.fileName() << "' for writing!"; + return; + } auto data = doc.toJson(QJsonDocument::Indented); qDebug() << QString::fromUtf8(data); jsonFile.write(data); diff --git a/tests/Version_test.cpp b/tests/Version_test.cpp index 4c67cc544..15be63f62 100644 --- a/tests/Version_test.cpp +++ b/tests/Version_test.cpp @@ -106,7 +106,10 @@ class VersionTest : public QObject { QFile vector_file{ test_vector_dir.absoluteFilePath("test_vectors.txt") }; - vector_file.open(QFile::OpenModeFlag::ReadOnly); + if (!vector_file.open(QFile::OpenModeFlag::ReadOnly)) { + qCritical() << "Failed to open file '" << vector_file.fileName() << "' for reading!"; + return; + } int test_number = 0; const QString test_name_template{ "FlexVer test #%1 (%2)" };