From 37cbc9500e5ea8a07401105cbc63a0673e87e392 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:42:03 +0100 Subject: [PATCH 01/15] Memory Leak in main.cpp --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 30441e1..5b1798d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ int main(void) { // cout << "refurbishingHddTool" << endl; - reHDD *app = new reHDD(); - app->app_logic(); + reHDD app; + app.app_logic(); return EXIT_SUCCESS; } \ No newline at end of file -- 2.50.1 From ff6a1763e017e0a8d7e66e0ebfb3ca6b1f6ba1da Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:44:53 +0100 Subject: [PATCH 02/15] Memory Leak in Drive Scanning --- src/reHDD.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 5852628..597c6d6 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -326,28 +326,28 @@ void reHDD::searchDrives(std::list *plistDrives) if (devName.empty()) continue; - Drive *tmpDrive = new Drive("/dev/" + devName); - tmpDrive->state = Drive::NONE; - tmpDrive->bIsOffline = false; + Drive tmpDrive("/dev/" + devName); + tmpDrive.state = Drive::NONE; + tmpDrive.bIsOffline = false; // Set connection type if (transport == "sata") - tmpDrive->connectionType = Drive::SATA; + tmpDrive.connectionType = Drive::SATA; else if (transport == "usb") - tmpDrive->connectionType = Drive::USB; + tmpDrive.connectionType = Drive::USB; else if (transport == "nvme") - tmpDrive->connectionType = Drive::NVME; + tmpDrive.connectionType = Drive::NVME; else - tmpDrive->connectionType = Drive::UNKNOWN; + tmpDrive.connectionType = Drive::UNKNOWN; - plistDrives->push_back(*tmpDrive); + plistDrives->push_back(tmpDrive); Logger::logThis()->info( - "Drive found: " + tmpDrive->getPath() + + "Drive found: " + tmpDrive.getPath() + " (type: " + - (tmpDrive->connectionType == Drive::USB ? "USB" : tmpDrive->connectionType == Drive::SATA ? "SATA" - : tmpDrive->connectionType == Drive::NVME ? "NVME" - : "UNKNOWN") + + (tmpDrive.connectionType == Drive::USB ? "USB" : tmpDrive.connectionType == Drive::SATA ? "SATA" + : tmpDrive.connectionType == Drive::NVME ? "NVME" + : "UNKNOWN") + ")"); } -- 2.50.1 From 2d6378835266b5ff7b10c8cc9b8eb7c0ca76317a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:45:42 +0100 Subject: [PATCH 03/15] Nullptr Return Without Proper Handling --- src/reHDD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 597c6d6..2169a07 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -94,7 +94,7 @@ Drive *reHDD::getSelectedDrive() else { Logger::logThis()->warning("selected drive not present"); - return {}; + return nullptr; } } -- 2.50.1 From bc4083a98c9f50b341bef00e3484bfdc547dc7df Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:47:24 +0100 Subject: [PATCH 04/15] Resource Leak - File Descriptor Not Checked --- src/reHDD.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 2169a07..8083925 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -313,6 +313,7 @@ void reHDD::searchDrives(std::list *plistDrives) if (!fp) { Logger::logThis()->error("Unable to execute lsblk to scan drives"); + pclose(fp); exit(EXIT_FAILURE); } -- 2.50.1 From bcabad06206db0cac12a2ec758c5b428a8757a1c Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:48:38 +0100 Subject: [PATCH 05/15] Unchecked popen/pclose Return Values --- src/reHDD.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 8083925..38850e8 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -405,6 +405,7 @@ void reHDD::filterIgnoredDrives(list *plistDrives) FILE *outputfileBlkid = popen(sCMD.c_str(), "r"); // get UUID from drive if (outputfileBlkid == NULL) { + pclose(outputfileBlkid); exit(EXIT_FAILURE); } @@ -684,6 +685,7 @@ bool reHDD::getSystemDrive(string &systemDrive) if (outputfileHwinfo == NULL) { Logger::logThis()->error("Unable to scan attached drives for system drive"); + pclose(outputfileHwinfo); exit(EXIT_FAILURE); } -- 2.50.1 From eded3f166c77be106da452fd26d8bf331a268247 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:52:10 +0100 Subject: [PATCH 06/15] Revert "Unchecked popen/pclose Return Values" This reverts commit bcabad06206db0cac12a2ec758c5b428a8757a1c. --- src/reHDD.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 38850e8..8083925 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -405,7 +405,6 @@ void reHDD::filterIgnoredDrives(list *plistDrives) FILE *outputfileBlkid = popen(sCMD.c_str(), "r"); // get UUID from drive if (outputfileBlkid == NULL) { - pclose(outputfileBlkid); exit(EXIT_FAILURE); } @@ -685,7 +684,6 @@ bool reHDD::getSystemDrive(string &systemDrive) if (outputfileHwinfo == NULL) { Logger::logThis()->error("Unable to scan attached drives for system drive"); - pclose(outputfileHwinfo); exit(EXIT_FAILURE); } -- 2.50.1 From 46e8dae697980b40cecf3a6729be58c2fc0c20c5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:59:19 +0100 Subject: [PATCH 07/15] Race Condition with Shared Drive List --- src/reHDD.cpp | 179 +++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 89 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 8083925..f460325 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -135,77 +135,77 @@ void reHDD::ThreadUserInput() { while (true) { - // cout << TUI::readUserInput() << endl; - switch (TUI::readUserInput()) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - case TUI::UserInput::DownKey: - // cout << "Down" << endl; - handleArrowKey(TUI::UserInput::DownKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::UpKey: - // cout << "Up" << endl; - handleArrowKey(TUI::UserInput::UpKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Undefined: - // cout << "Undefined" << endl; - break; - case TUI::UserInput::Abort: - // cout << "Abort" << endl; - handleAbort(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Delete: - // cout << "Delete" << endl; - if (getSelectedDrive() != nullptr) + // cout << TUI::readUserInput() << endl; + switch (TUI::readUserInput()) { - if (getSelectedDrive()->state == Drive::NONE) + case TUI::UserInput::DownKey: + // cout << "Down" << endl; + handleArrowKey(TUI::UserInput::DownKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::UpKey: + // cout << "Up" << endl; + handleArrowKey(TUI::UserInput::UpKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Undefined: + // cout << "Undefined" << endl; + break; + case TUI::UserInput::Abort: + // cout << "Abort" << endl; + handleAbort(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Delete: + // cout << "Delete" << endl; + + if (tmpSelectedDrive != nullptr) { - getSelectedDrive()->state = Drive::DELETE_SELECTED; + if (tmpSelectedDrive->state == Drive::NONE) + { + tmpSelectedDrive->state = Drive::DELETE_SELECTED; + } } - } - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Shred: - // cout << "Shred" << endl; - - if (getSelectedDrive() != nullptr) - { - if (getSelectedDrive()->state == Drive::NONE) + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Shred: + // cout << "Shred" << endl; + if (tmpSelectedDrive->state == Drive::NONE) { - getSelectedDrive()->state = Drive::SHRED_SELECTED; + tmpSelectedDrive->state = Drive::SHRED_SELECTED; } + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::ShredAll: + // cout << "ShredAll" << endl; + startShredAllDrives(&listDrives); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Enter: + // cout << "Enter" << endl; + handleEnter(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::ESC: + // cout << "ESC" << endl; + handleESC(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Terminate: + // cout << "Terminate" << endl; + stopShredAllDrives(&listDrives); + ui->terminateTUI(); + sleep(5); // sleep 5 sec + std::exit(1); // Terminates main, doesn't wait for threads + break; + default: + break; } - - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::ShredAll: - // cout << "ShredAll" << endl; - startShredAllDrives(&listDrives); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Enter: - // cout << "Enter" << endl; - handleEnter(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::ESC: - // cout << "ESC" << endl; - handleESC(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Terminate: - // cout << "Terminate" << endl; - stopShredAllDrives(&listDrives); - ui->terminateTUI(); - sleep(5); // sleep 5 sec - std::exit(1); // Terminates main, doesn't wait for threads - break; - default: - break; } } } @@ -224,13 +224,14 @@ void reHDD::ThreadShred(Drive *const pDrive) void reHDD::ThreadDelete() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - getSelectedDrive()->setActionStartTimestamp(); // save timestamp at start of deleting - Delete::deleteDrive(getSelectedDrive()); // blocking, no thread - getSelectedDrive()->state = Drive::TaskState::NONE; // delete finished - getSelectedDrive()->bWasDeleted = true; - Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + tmpSelectedDrive->setActionStartTimestamp(); // save timestamp at start of deleting + Delete::deleteDrive(tmpSelectedDrive); // blocking, no thread + tmpSelectedDrive->state = Drive::TaskState::NONE; // delete finished + tmpSelectedDrive->bWasDeleted = true; + Logger::logThis()->info("Finished delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); ui->updateTUI(&listDrives, u8SelectedEntry); } } @@ -313,7 +314,6 @@ void reHDD::searchDrives(std::list *plistDrives) if (!fp) { Logger::logThis()->error("Unable to execute lsblk to scan drives"); - pclose(fp); exit(EXIT_FAILURE); } @@ -620,22 +620,21 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) void reHDD::handleEnter() { - - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED) { - Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE; - // task for drive is running --> don't show more task options - Drive *pTmpDrive = getSelectedDrive(); - thread(ThreadShred, pTmpDrive).detach(); + Logger::logThis()->info("Started shred/check for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); + tmpSelectedDrive->state = Drive::TaskState::SHRED_ACTIVE; + // task for drive is running --> don't show more task option + thread(ThreadShred, tmpSelectedDrive).detach(); } - if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED) { - Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); - getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE; + Logger::logThis()->info("Started delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); + tmpSelectedDrive->state = Drive::TaskState::DELETE_ACTIVE; // task for drive is running --> don't show more task options thread(ThreadDelete).detach(); } @@ -644,17 +643,18 @@ void reHDD::handleEnter() void reHDD::handleESC() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED) { - getSelectedDrive()->state = Drive::TaskState::NONE; + tmpSelectedDrive->state = Drive::TaskState::NONE; // task for drive is selected --> remove selection } - if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED) + if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED) { - getSelectedDrive()->state = Drive::TaskState::NONE; + tmpSelectedDrive->state = Drive::TaskState::NONE; // task for drive is selected --> remove selection } } @@ -662,12 +662,13 @@ void reHDD::handleESC() void reHDD::handleAbort() { - if (getSelectedDrive() != nullptr) + Drive *tmpSelectedDrive = getSelectedDrive(); + if (tmpSelectedDrive != nullptr) { - if (getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE) + if (tmpSelectedDrive->state == Drive::SHRED_ACTIVE || tmpSelectedDrive->state == Drive::DELETE_ACTIVE) { - getSelectedDrive()->state = Drive::NONE; - Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial()); + tmpSelectedDrive->state = Drive::NONE; + Logger::logThis()->info("Abort-Shred-Signal for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); // task for drive is running --> remove selection } } -- 2.50.1 From f303f9f03238fa2c2c02ab2a95d28a403ed58d3a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:01:13 +0100 Subject: [PATCH 08/15] Integer Overflow in sprintf Buffer --- include/reHDD.h | 2 +- src/drive.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 893b0bd..ad23206 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -31,7 +31,7 @@ #endif // Logic -// #define DRYRUN // don't touch the drives +#define DRYRUN // don't touch the drives #define FROZEN_ALERT // show alert if drive is frozen #define ZERO_CHECK // check drive after shred if all bytes are zero, show alert if this fails diff --git a/src/drive.cpp b/src/drive.cpp index 1ca3e61..d0b504f 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -62,8 +62,8 @@ string Drive::sCapacityToText() dSize /= 1000; u16UnitIndex++; } - - sprintf(acBuffer, "%.*f %s", u16UnitIndex - 3, dSize, units[u16UnitIndex]); + int precision = (u16UnitIndex >= 3) ? (u16UnitIndex - 3) : 0; + sprintf(acBuffer, "%.*f %s", precision, dSize, units[u16UnitIndex]); return acBuffer; } -- 2.50.1 From d82c45057ba7b3bb475934a9324df6483a013c82 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:04:00 +0100 Subject: [PATCH 09/15] Missing Error Check on time() Calls --- src/drive.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/drive.cpp b/src/drive.cpp index d0b504f..78b99ed 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -148,12 +148,20 @@ void Drive::setDriveSMARTData(string modelFamily, void Drive::setTimestamp() { - time(&this->u32Timestamp); + if (time(&this->u32Timestamp) == -1) + { + // handle error + this->u32Timestamp = 0U; + } } void Drive::setActionStartTimestamp() { - time(&this->u32TimestampTaskStart); + if (time(&this->u32TimestampTaskStart) == -1) + { + // handle error + this->u32TimestampTaskStart = 0U; + } } time_t Drive::getActionStartTimestamp() @@ -164,7 +172,11 @@ time_t Drive::getActionStartTimestamp() void Drive::calculateTaskDuration() { time_t u32localtime; - time(&u32localtime); + if (time(&u32localtime) == -1) + { + // handle error + u32localtime = 0U; + } this->u32TaskDuration = u32localtime - this->u32TimestampTaskStart; } @@ -178,6 +190,11 @@ void Drive::checkFrozenDrive(void) { time_t u32localtime; time(&u32localtime); + if (time(&u32localtime) == -1) + { + // handle error + u32localtime = 0U; + } if ((u32localtime - this->u32Timestamp) >= (FROZEN_TIMEOUT * 60) && (this->u32Timestamp > 0) && (this->getTaskPercentage() < 100.0)) { -- 2.50.1 From 4afc1552307d32d9b8e9d5a9de6e54060273e8f2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:11:35 +0100 Subject: [PATCH 10/15] Unchecked strerror() with Invalid Errno --- src/shred.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/shred.cpp b/src/shred.cpp index 2255310..8fd3fae 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -36,7 +36,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) ostringstream address; address << (void const *)&(*drive); Logger::logThis()->info("Shred-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); - drive->bWasShredStarted = true; //Mark drive as partly shredded + drive->bWasShredStarted = true; // Mark drive as partly shredded #ifdef DRYRUN for (int i = 0; i <= 500; i++) @@ -60,7 +60,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) randomSrcFileDiscr = open(randomsrc, O_RDONLY | O_LARGEFILE); if (randomSrcFileDiscr == -1) { - std::string errorMsg(strerror(randomSrcFileDiscr)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Open random source failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(randomsrc); cleanup(); @@ -71,7 +71,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) driveFileDiscr = open(cpDrivePath, O_RDWR | O_LARGEFILE); if (driveFileDiscr == -1) { - std::string errorMsg(strerror(driveFileDiscr)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Open drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(cpDrivePath); cleanup(); @@ -82,7 +82,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) ssize_t readRet = read(randomSrcFileDiscr, ucKey, sizeof(ucKey)); if (readRet <= 0) { - std::string errorMsg(strerror(readRet)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Read random key failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror(randomsrc); cleanup(); @@ -93,7 +93,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) this->ulDriveByteSize = getDriveSizeInBytes(driveFileDiscr); drive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); // set inital timestamp for speed metric - drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric + drive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial()); @@ -132,7 +132,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) if (iByteShredded <= 0) { - std::string errorMsg(strerror(iByteShredded)); + std::string errorMsg(strerror(errno)); Logger::logThis()->error("Shred-Task: Write to drive failed! " + errorMsg + " - Drive: " + drive->getSerial()); perror("unable to write random data"); cleanup(); -- 2.50.1 From c7d37b1d956d3d5fec63122ec58e4f28daaee5f1 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:27:56 +0100 Subject: [PATCH 11/15] Missing Bounds Check on Array Access --- src/drive.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/drive.cpp b/src/drive.cpp index 78b99ed..5ae0b7e 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -62,6 +62,10 @@ string Drive::sCapacityToText() dSize /= 1000; u16UnitIndex++; } + if (u16UnitIndex >= 9) + { + u16UnitIndex = 8; + } int precision = (u16UnitIndex >= 3) ? (u16UnitIndex - 3) : 0; sprintf(acBuffer, "%.*f %s", precision, dSize, units[u16UnitIndex]); return acBuffer; -- 2.50.1 From 2ca0b8b06184c24dc00beeb04157ce622e5bded5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:30:36 +0100 Subject: [PATCH 12/15] Missing Validation of Pipe Return Value --- src/reHDD.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index f460325..dc0bd63 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -43,8 +43,15 @@ void reHDD::app_logic(void) ui = new TUI(); ui->initTUI(); - pipe(fdNewDrivesInformPipe); - pipe(fdShredInformPipe); + if (pipe(fdNewDrivesInformPipe) == -1) + { + Logger::logThis()->error("Unable to open pipe 'fdNewDrivesInformPipe'"); + } + + if (pipe(fdShredInformPipe) == -1) + { + Logger::logThis()->error("Unable to open pipe 'fdShredInformPipe'"); + } thread thDevices(ThreadScanDevices); // start thread that scans for drives thread thUserInput(ThreadUserInput); // start thread that reads user input -- 2.50.1 From 460cfeab2cb42e0ce4c1460d8b749b6aa2cbb1d3 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:36:53 +0100 Subject: [PATCH 13/15] Iterator Invalidation Bug --- src/reHDD.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index dc0bd63..364eb48 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -384,7 +384,6 @@ void reHDD::filterIgnoredDrives(list *plistDrives) Logger::logThis()->info("system drive found --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } @@ -437,7 +436,6 @@ void reHDD::filterIgnoredDrives(list *plistDrives) Logger::logThis()->info("same uuid found than in ignore file --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } @@ -459,7 +457,6 @@ void reHDD::filterInvalidDrives(list *plistDrives) Logger::logThis()->info("Drive reports zero capacity --> ignore this drive: " + it->getPath()); #endif it = plistDrives->erase(it); - it--; } } } -- 2.50.1 From 43ccdbd4d8ff526b6150c1e3ecbdddaaceeae88f Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:39:04 +0100 Subject: [PATCH 14/15] fix terminate if no drive is detected --- src/reHDD.cpp | 118 +++++++++++++++++++++++++------------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 364eb48..ac8c940 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -143,76 +143,76 @@ void reHDD::ThreadUserInput() while (true) { Drive *tmpSelectedDrive = getSelectedDrive(); - if (tmpSelectedDrive != nullptr) + + // cout << TUI::readUserInput() << endl; + switch (TUI::readUserInput()) { + case TUI::UserInput::DownKey: + // cout << "Down" << endl; + handleArrowKey(TUI::UserInput::DownKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::UpKey: + // cout << "Up" << endl; + handleArrowKey(TUI::UserInput::UpKey); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Undefined: + // cout << "Undefined" << endl; + break; + case TUI::UserInput::Abort: + // cout << "Abort" << endl; + handleAbort(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Delete: + // cout << "Delete" << endl; - // cout << TUI::readUserInput() << endl; - switch (TUI::readUserInput()) + if (tmpSelectedDrive != nullptr) { - case TUI::UserInput::DownKey: - // cout << "Down" << endl; - handleArrowKey(TUI::UserInput::DownKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::UpKey: - // cout << "Up" << endl; - handleArrowKey(TUI::UserInput::UpKey); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Undefined: - // cout << "Undefined" << endl; - break; - case TUI::UserInput::Abort: - // cout << "Abort" << endl; - handleAbort(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Delete: - // cout << "Delete" << endl; - - if (tmpSelectedDrive != nullptr) + if (tmpSelectedDrive->state == Drive::NONE) { - if (tmpSelectedDrive->state == Drive::NONE) - { - tmpSelectedDrive->state = Drive::DELETE_SELECTED; - } + tmpSelectedDrive->state = Drive::DELETE_SELECTED; } + } - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Shred: - // cout << "Shred" << endl; + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Shred: + // cout << "Shred" << endl; + if (tmpSelectedDrive != nullptr) + { if (tmpSelectedDrive->state == Drive::NONE) { tmpSelectedDrive->state = Drive::SHRED_SELECTED; } - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::ShredAll: - // cout << "ShredAll" << endl; - startShredAllDrives(&listDrives); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Enter: - // cout << "Enter" << endl; - handleEnter(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::ESC: - // cout << "ESC" << endl; - handleESC(); - ui->updateTUI(&listDrives, u8SelectedEntry); - break; - case TUI::UserInput::Terminate: - // cout << "Terminate" << endl; - stopShredAllDrives(&listDrives); - ui->terminateTUI(); - sleep(5); // sleep 5 sec - std::exit(1); // Terminates main, doesn't wait for threads - break; - default: - break; } + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::ShredAll: + // cout << "ShredAll" << endl; + startShredAllDrives(&listDrives); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Enter: + // cout << "Enter" << endl; + handleEnter(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::ESC: + // cout << "ESC" << endl; + handleESC(); + ui->updateTUI(&listDrives, u8SelectedEntry); + break; + case TUI::UserInput::Terminate: + // cout << "Terminate" << endl; + stopShredAllDrives(&listDrives); + ui->terminateTUI(); + sleep(5); // sleep 5 sec + std::exit(1); // Terminates main, doesn't wait for threads + break; + default: + break; } } } -- 2.50.1 From ba2f036d88a4a630d1bc43d03a054f03365ef26a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:41:09 +0100 Subject: [PATCH 15/15] Uninitialized Memory in cLine --- src/reHDD.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index ac8c940..defcb5a 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -426,6 +426,7 @@ void reHDD::filterIgnoredDrives(list *plistDrives) // cout << "blkid uuid:" << sUUID << endl; } } + free(cLine); pclose(outputfileBlkid); // cout << "blkid uuid:" << sUUID << endl; -- 2.50.1