From cd6132a8984d13638a059316d2ecab02d624e261 Mon Sep 17 00:00:00 2001 From: gitee-zeqi Date: Sat, 2 May 2026 17:03:50 +0800 Subject: [PATCH 1/2] fix(deepin-os-release): Filter out RDRAND hardware random warnings to ensure clean output This fix adds a pipe-based stderr filter using QThread, precisely discarding the known RDRAND warning lines while preserving all other stderr messages. --- tools/deepin-os-release/main.cpp | 51 ++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tools/deepin-os-release/main.cpp b/tools/deepin-os-release/main.cpp index bdc0e48f..0f670ca0 100644 --- a/tools/deepin-os-release/main.cpp +++ b/tools/deepin-os-release/main.cpp @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: LGPL-3.0-or-later +#define _GNU_SOURCE + #include "dsysinfo.h" #include @@ -11,9 +13,41 @@ #include #include +#include +#include DCORE_USE_NAMESPACE +class StderrFilterThread : public QThread +{ +public: + explicit StderrFilterThread(int origStderr, int readFd, QObject *parent = nullptr) + : QThread(parent), m_origStderr(origStderr), m_readFd(readFd) {} + +protected: + void run() override + { + FILE *readEnd = fdopen(m_readFd, "r"); + if (!readEnd) return; + + char *line = nullptr; + size_t len = 0; + while (getline(&line, &len, readEnd) != -1) { + if (strstr(line, "WARNING: CPU random generator seem to be failing") || + strstr(line, "WARNING: RDRND generated:")) { + continue; // 丢弃该行 + } + write(m_origStderr, line, strlen(line)); + } + free(line); + fclose(readEnd); + } + +private: + int m_origStderr; + int m_readFd; +}; + bool distributionInfoValid() { return QFile::exists(DSysInfo::distributionInfoPath()); } @@ -27,6 +61,16 @@ void printDistributionOrgInfo(DSysInfo::OrgType type) { int main(int argc, char *argv[]) { + // 设置过滤器 + int origStderr = dup(STDERR_FILENO); + int pipefd[2]; + pipe(pipefd); + dup2(pipefd[1], STDERR_FILENO); + close(pipefd[1]); + + StderrFilterThread *filterThread = new StderrFilterThread(origStderr, pipefd[0]); + filterThread->start(); + QCoreApplication app(argc, argv); Q_UNUSED(app) @@ -123,5 +167,12 @@ int main(int argc, char *argv[]) } } + // 清理 + dup2(origStderr, STDERR_FILENO); // 恢复 stderr + close(origStderr); + + filterThread->wait(); + delete filterThread; + return 0; } From 56c90499e067d18e8d6abca0c61cf5a9e44176c5 Mon Sep 17 00:00:00 2001 From: gitee-zeqi Date: Sat, 23 May 2026 19:03:50 +0800 Subject: [PATCH 2/2] fix(deepin-os-release): filter RDRAND warnings and improve error handling - Filter out known RDRAND-related WARNING lines from stderr to prevent pollution of stdout when stdout and stderr are merged by CMake. - Add missing header for free(). - Close pipe file descriptor when fdopen fails to avoid potential deadlock. - Wrap write() in a retry loop to handle EINTR and short writes. - Update SPDX copyright year to 2026. --- tools/deepin-os-release/main.cpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/tools/deepin-os-release/main.cpp b/tools/deepin-os-release/main.cpp index 0f670ca0..8416f2f7 100644 --- a/tools/deepin-os-release/main.cpp +++ b/tools/deepin-os-release/main.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2017-2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -15,6 +15,7 @@ #include #include #include +#include DCORE_USE_NAMESPACE @@ -28,16 +29,31 @@ class StderrFilterThread : public QThread void run() override { FILE *readEnd = fdopen(m_readFd, "r"); - if (!readEnd) return; + if (!readEnd) { + close(m_readFd); // Close unused file descriptors + return; + } char *line = nullptr; size_t len = 0; while (getline(&line, &len, readEnd) != -1) { if (strstr(line, "WARNING: CPU random generator seem to be failing") || strstr(line, "WARNING: RDRND generated:")) { - continue; // 丢弃该行 + continue; // Discard this row + } + // Use a loop to ensure complete writing + size_t total = 0; + size_t remaining = strlen(line); + const char *buf = line; + while (total < remaining) { + ssize_t written = write(m_origStderr, buf + total, remaining - total); + if (written < 0) { + if (errno == EINTR) + continue; // Interrupted by signal, retry + break; // Other errors, abandon writing + } + total += written; } - write(m_origStderr, line, strlen(line)); } free(line); fclose(readEnd); @@ -61,7 +77,7 @@ void printDistributionOrgInfo(DSysInfo::OrgType type) { int main(int argc, char *argv[]) { - // 设置过滤器 + // Set filter int origStderr = dup(STDERR_FILENO); int pipefd[2]; pipe(pipefd); @@ -167,8 +183,8 @@ int main(int argc, char *argv[]) } } - // 清理 - dup2(origStderr, STDERR_FILENO); // 恢复 stderr + // clean + dup2(origStderr, STDERR_FILENO); // Restore stderr close(origStderr); filterThread->wait();