(#1693) Use a better approach to detect a noexec mount option

Signed-off-by: bit6tream <megapixel483@gmail.com>
This commit is contained in:
bit6tream 2023-11-23 15:19:04 +03:00
parent 681e76c551
commit d414599974

View File

@ -82,7 +82,6 @@
#include <iostream>
#include <mutex>
#include <string_view>
#include <QAccessible>
#include <QCommandLineParser>
@ -133,8 +132,13 @@
#include "gamemode_client.h"
#endif
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
#include <mntent.h>
#if defined(Q_OS_LINUX)
#include <sys/statvfs.h>
#endif
#if defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
#include <sys/mount.h>
#include <sys/types.h>
#endif
#if defined(Q_OS_MAC)
@ -993,36 +997,37 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv)
}
}
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
// notify user if /tmp is mounted with `noexec` (#1693)
{
FILE* description = setmntent(MOUNTED, "r");
mntent* info = nullptr;
bool is_tmp_noexec = false;
while ((info = getmntent(description)) != nullptr) {
std::string_view directory = info->mnt_dir;
std::string_view options = info->mnt_opts;
#if defined(Q_OS_LINUX)
if (directory == "/tmp" && options.rfind("noexec") != std::string_view::npos) {
auto infoMsg =
tr("Your /tmp directory is currently mounted with the 'noexec' flag enabled.\n"
"Some versions of Minecraft may not launch.\n");
auto msgBox = new QMessageBox(QMessageBox::Information, tr("Incompatible system configuration"), infoMsg, QMessageBox::Ok);
msgBox->setDefaultButton(QMessageBox::Ok);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setMinimumWidth(460);
msgBox->adjustSize();
msgBox->open();
break;
}
}
struct statvfs tmp_stat;
statvfs("/tmp", &tmp_stat);
is_tmp_noexec = tmp_stat.f_flag & ST_NOEXEC;
endmntent(description);
}
#elif defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
struct statfs tmp_stat;
statfs("/tmp", &tmp_stat);
is_tmp_noexec = tmp_stat.f_flags & MNT_NOEXEC;
#endif
if (is_tmp_noexec) {
auto infoMsg =
tr("Your /tmp directory is currently mounted with the 'noexec' flag enabled.\n"
"Some versions of Minecraft may not launch.\n");
auto msgBox = new QMessageBox(QMessageBox::Information, tr("Incompatible system configuration"), infoMsg, QMessageBox::Ok);
msgBox->setDefaultButton(QMessageBox::Ok);
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setMinimumWidth(460);
msgBox->adjustSize();
msgBox->open();
}
}
if (createSetupWizard()) {
return;
}