From 60dfa67ec7f20e574a1ecf112a759aac30523ce2 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 14 Nov 2024 17:54:16 -0800 Subject: [PATCH] io/fileview: support zero-sized files (/proc) --- src/io/fileview.cpp | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/io/fileview.cpp b/src/io/fileview.cpp index 6cfe4bc4..063ea831 100644 --- a/src/io/fileview.cpp +++ b/src/io/fileview.cpp @@ -1,4 +1,5 @@ #include "fileview.hpp" +#include #include #include @@ -68,22 +69,37 @@ void FileViewReader::read(FileViewState& state, bool doStringConversion) { } auto& data = state.data; - data = QByteArray(file.size(), Qt::Uninitialized); + if (file.size() != 0) { + data = QByteArray(file.size(), Qt::Uninitialized); + qint64 i = 0; - qint64 i = 0; + while (true) { + auto r = file.read(data.data() + i, data.length() - i); // NOLINT - while (true) { - auto r = file.read(data.data() + i, data.length() - i); // NOLINT + if (r == -1) { + qCCritical(logFileView) << "Failed to read" << state.path; + goto error; + } else if (r == 0) { + data.resize(i); + break; + } - if (r == -1) { - qCCritical(logFileView) << "Failed to read" << state.path; - goto error; - } else if (r == 0) { - data.resize(i); - break; + i += r; } + } else { + auto buf = std::array(); - i += r; + while (true) { + auto r = file.read(buf.data(), buf.size()); // NOLINT + + if (r == -1) { + qCCritical(logFileView) << "Failed to read" << state.path; + goto error; + } else { + data.append(buf.data(), r); + if (r == 0) break; + } + } } if (doStringConversion) {