From d5037d4f795242998e1a296a592df460a545b6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 31 Oct 2018 22:44:23 +0100 Subject: [PATCH] GH-2412: collect dead processes on linux properly Issues were caused by use of `popen()` with no `pclose()` counterpart... --- api/logic/FileSystem.cpp | 2 +- .../minecraft/launch/PrintInstanceInfo.cpp | 99 +++++++++++-------- 2 files changed, 61 insertions(+), 40 deletions(-) diff --git a/api/logic/FileSystem.cpp b/api/logic/FileSystem.cpp index 1d8b290de..7e3c18418 100644 --- a/api/logic/FileSystem.cpp +++ b/api/logic/FileSystem.cpp @@ -294,7 +294,7 @@ QString NormalizePath(QString path) } } -QString badFilenameChars = "\"\\/?<>:*|!"; +QString badFilenameChars = "\"\\/?<>:*|!+"; QString RemoveInvalidFilenameChars(QString string, QChar replaceWith) { diff --git a/api/logic/minecraft/launch/PrintInstanceInfo.cpp b/api/logic/minecraft/launch/PrintInstanceInfo.cpp index 83bf584fb..6d5b93aeb 100644 --- a/api/logic/minecraft/launch/PrintInstanceInfo.cpp +++ b/api/logic/minecraft/launch/PrintInstanceInfo.cpp @@ -19,67 +19,88 @@ #include "PrintInstanceInfo.h" #include -void PrintInstanceInfo::executeTask() -{ - auto instance = m_parent->instance(); - auto lines = instance->verboseDescription(m_session); - #ifdef Q_OS_LINUX +namespace { +void probeProcCpuinfo(QStringList &log) +{ std::ifstream cpuin("/proc/cpuinfo"); for (std::string line; std::getline(cpuin, line);) { if (strncmp(line.c_str(), "model name", 10) == 0) { - QStringList clines = (QStringList() << QString::fromStdString(line.substr(13, std::string::npos))); - logLines(clines, MessageLevel::MultiMC); + log << QString::fromStdString(line.substr(13, std::string::npos)); break; } } +} +void runLspci(QStringList &log) +{ + // FIXME: fixed size buffers... char buff[512]; int gpuline = -1; int cline = 0; - FILE *fp = popen("lspci -k", "r"); - if (fp != NULL) + FILE * lspci = popen("lspci -k", "r"); + + if (!lspci) + return; + + while (fgets(buff, 512, lspci) != NULL) { - while (fgets(buff, 512, fp) != NULL) + std::string str(buff); + if (str.length() < 9) + continue; + if (str.substr(8, 3) == "VGA") { - std::string str(buff); - if (str.length() < 9) - continue; - if (str.substr(8, 3) == "VGA") - { - gpuline = cline; - QStringList glines = (QStringList() << QString::fromStdString(str.substr(35, std::string::npos))); - logLines(glines, MessageLevel::MultiMC); - } - if (gpuline > -1 && gpuline != cline) - { - if (cline - gpuline < 3) - { - QStringList alines = (QStringList() << QString::fromStdString(str.substr(1, std::string::npos))); - logLines(alines, MessageLevel::MultiMC); - } - } - cline++; + gpuline = cline; + log << QString::fromStdString(str.substr(35, std::string::npos)); } - } - - FILE *fp2 = popen("glxinfo", "r"); - if (fp2 != NULL) - { - while (fgets(buff, 512, fp2) != NULL) + if (gpuline > -1 && gpuline != cline) { - if (strncmp(buff, "OpenGL version string:", 22) == 0) + if (cline - gpuline < 3) { - QStringList drlines = (QStringList() << QString::fromUtf8(buff)); - logLines(drlines, MessageLevel::MultiMC); - break; + log << QString::fromStdString(str.substr(1, std::string::npos)); } } + cline++; } + pclose(lspci); +} + +void runGlxinfo(QStringList & log) +{ + // FIXME: fixed size buffers... + char buff[512]; + FILE *glxinfo = popen("glxinfo", "r"); + if (!glxinfo) + return; + + while (fgets(buff, 512, glxinfo) != NULL) + { + if (strncmp(buff, "OpenGL version string:", 22) == 0) + { + log << QString::fromUtf8(buff); + break; + } + } + pclose(glxinfo); +} + +} #endif - logLines(lines, MessageLevel::MultiMC); +void PrintInstanceInfo::executeTask() +{ + auto instance = m_parent->instance(); + QStringList log; + +#ifdef Q_OS_LINUX + ::probeProcCpuinfo(log); + ::runLspci(log); + ::runGlxinfo(log); +#endif + + logLines(log, MessageLevel::MultiMC); + logLines(instance->verboseDescription(m_session), MessageLevel::MultiMC); emitSucceeded(); }