From 37cbc9500e5ea8a07401105cbc63a0673e87e392 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:42:03 +0100 Subject: [PATCH 01/32] 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 From ff6a1763e017e0a8d7e66e0ebfb3ca6b1f6ba1da Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:44:53 +0100 Subject: [PATCH 02/32] 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") + ")"); } From 2d6378835266b5ff7b10c8cc9b8eb7c0ca76317a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:45:42 +0100 Subject: [PATCH 03/32] 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; } } From bc4083a98c9f50b341bef00e3484bfdc547dc7df Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:47:24 +0100 Subject: [PATCH 04/32] 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); } From bcabad06206db0cac12a2ec758c5b428a8757a1c Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:48:38 +0100 Subject: [PATCH 05/32] 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); } From eded3f166c77be106da452fd26d8bf331a268247 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:52:10 +0100 Subject: [PATCH 06/32] 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); } From 46e8dae697980b40cecf3a6729be58c2fc0c20c5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 18:59:19 +0100 Subject: [PATCH 07/32] 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 } } From f303f9f03238fa2c2c02ab2a95d28a403ed58d3a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:01:13 +0100 Subject: [PATCH 08/32] 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; } From d82c45057ba7b3bb475934a9324df6483a013c82 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:04:00 +0100 Subject: [PATCH 09/32] 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)) { From 4afc1552307d32d9b8e9d5a9de6e54060273e8f2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 19:11:35 +0100 Subject: [PATCH 10/32] 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(); From c7d37b1d956d3d5fec63122ec58e4f28daaee5f1 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:27:56 +0100 Subject: [PATCH 11/32] 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; From 2ca0b8b06184c24dc00beeb04157ce622e5bded5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:30:36 +0100 Subject: [PATCH 12/32] 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 From 460cfeab2cb42e0ce4c1460d8b749b6aa2cbb1d3 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:36:53 +0100 Subject: [PATCH 13/32] 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--; } } } From 43ccdbd4d8ff526b6150c1e3ecbdddaaceeae88f Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:39:04 +0100 Subject: [PATCH 14/32] 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; } } } From ba2f036d88a4a630d1bc43d03a054f03365ef26a Mon Sep 17 00:00:00 2001 From: localhorst Date: Sun, 7 Dec 2025 20:41:09 +0100 Subject: [PATCH 15/32] 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; From 7c923860821d2f7cdb1a7b3773b8f9c958b4f82c Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:09:25 +0100 Subject: [PATCH 16/32] Using sprintf Instead of snprintf --- include/drive.h | 1 + src/printer.cpp | 18 +++++++++--------- src/reHDD.cpp | 45 +++++++++++++++++++++++---------------------- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/include/drive.h b/include/drive.h index 1297e13..eae0643 100644 --- a/include/drive.h +++ b/include/drive.h @@ -47,6 +47,7 @@ public: bool bWasDeleted = false; bool bIsOffline = false; uint32_t u32DriveChecksumAfterShredding = 0U; + uint16_t u16DriveIndex = 0U; // Index of TUI list private: string sPath; diff --git a/src/printer.cpp b/src/printer.cpp index 0e8c60f..a0313ef 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -42,17 +42,17 @@ void Printer::print(Drive *drive) t_msgQueueData msgQueueData; msgQueueData.msg_queue_type = 1; - sprintf(msgQueueData.driveData.caDriveIndex, "%i", 42); // TODO: get from tui - sprintf(msgQueueData.driveData.caDriveState, "shredded"); + snprintf(msgQueueData.driveData.caDriveIndex, STR_BUFFER_SIZE, "%i", drive->u16DriveIndex); + snprintf(msgQueueData.driveData.caDriveState, STR_BUFFER_SIZE, "shredded"); strcpy(msgQueueData.driveData.caDriveModelFamily, drive->getModelFamily().c_str()); strcpy(msgQueueData.driveData.caDriveModelName, drive->getModelName().c_str()); - sprintf(msgQueueData.driveData.caDriveCapacity, "%li", drive->getCapacity()); + snprintf(msgQueueData.driveData.caDriveCapacity, STR_BUFFER_SIZE, "%li", drive->getCapacity()); strcpy(msgQueueData.driveData.caDriveSerialnumber, drive->getSerial().c_str()); - sprintf(msgQueueData.driveData.caDriveHours, "%i", drive->getPowerOnHours()); - sprintf(msgQueueData.driveData.caDriveCycles, "%i", drive->getPowerCycles()); - sprintf(msgQueueData.driveData.caDriveErrors, "%i", drive->getErrorCount()); - sprintf(msgQueueData.driveData.caDriveShredTimestamp, "%li", drive->getActionStartTimestamp()); - sprintf(msgQueueData.driveData.caDriveShredDuration, "%li", drive->getTaskDuration()); + snprintf(msgQueueData.driveData.caDriveHours, STR_BUFFER_SIZE, "%i", drive->getPowerOnHours()); + snprintf(msgQueueData.driveData.caDriveCycles, STR_BUFFER_SIZE, "%i", drive->getPowerCycles()); + snprintf(msgQueueData.driveData.caDriveErrors, STR_BUFFER_SIZE, "%i", drive->getErrorCount()); + snprintf(msgQueueData.driveData.caDriveShredTimestamp, STR_BUFFER_SIZE, "%li", drive->getActionStartTimestamp()); + snprintf(msgQueueData.driveData.caDriveShredDuration, STR_BUFFER_SIZE, "%li", drive->getTaskDuration()); switch (drive->connectionType) { @@ -70,7 +70,7 @@ void Printer::print(Drive *drive) strcpy(msgQueueData.driveData.caDriveConnectionType, "na"); } - sprintf(msgQueueData.driveData.caDriveReHddVersion, REHDD_VERSION); + snprintf(msgQueueData.driveData.caDriveReHddVersion, STR_BUFFER_SIZE, "%s", REHDD_VERSION); if (-1 == msgsnd(this->msqid, &msgQueueData, sizeof(t_msgQueueData) - sizeof(long), 0)) { diff --git a/src/reHDD.cpp b/src/reHDD.cpp index defcb5a..fbfb119 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -19,7 +19,7 @@ static list listDrives; // stores all drive data from scan thread TUI *ui; -static uint8_t u8SelectedEntry; +static uint16_t u16SelectedEntry; static fd_set selectSet; @@ -30,7 +30,7 @@ static fd_set selectSet; */ reHDD::reHDD(void) { - u8SelectedEntry = 0U; + u16SelectedEntry = 0U; } /** @@ -83,7 +83,7 @@ void reHDD::app_logic(void) Logger::logThis()->info("got progress signal from a shred task"); #endif } - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); } // endless loop thDevices.join(); thUserInput.join(); @@ -92,10 +92,11 @@ void reHDD::app_logic(void) Drive *reHDD::getSelectedDrive() { - if (u8SelectedEntry < listDrives.size()) + if (u16SelectedEntry < listDrives.size()) { list::iterator it = listDrives.begin(); - advance(it, u8SelectedEntry); + advance(it, u16SelectedEntry); + it->u16DriveIndex = u16SelectedEntry; return &(*it); } else @@ -150,12 +151,12 @@ void reHDD::ThreadUserInput() case TUI::UserInput::DownKey: // cout << "Down" << endl; handleArrowKey(TUI::UserInput::DownKey); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::UpKey: // cout << "Up" << endl; handleArrowKey(TUI::UserInput::UpKey); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::Undefined: // cout << "Undefined" << endl; @@ -163,7 +164,7 @@ void reHDD::ThreadUserInput() case TUI::UserInput::Abort: // cout << "Abort" << endl; handleAbort(); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::Delete: // cout << "Delete" << endl; @@ -176,7 +177,7 @@ void reHDD::ThreadUserInput() } } - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::Shred: // cout << "Shred" << endl; @@ -187,22 +188,22 @@ void reHDD::ThreadUserInput() tmpSelectedDrive->state = Drive::SHRED_SELECTED; } } - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::ShredAll: // cout << "ShredAll" << endl; startShredAllDrives(&listDrives); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::Enter: // cout << "Enter" << endl; handleEnter(); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::ESC: // cout << "ESC" << endl; handleESC(); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); break; case TUI::UserInput::Terminate: // cout << "Terminate" << endl; @@ -225,7 +226,7 @@ void reHDD::ThreadShred(Drive *const pDrive) Shred *pShredTask = new Shred(); // create new shred task pShredTask->shredDrive(pDrive, &fdShredInformPipe[1]); // start new shred task delete pShredTask; // delete shred task - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); } } @@ -239,7 +240,7 @@ void reHDD::ThreadDelete() tmpSelectedDrive->state = Drive::TaskState::NONE; // delete finished tmpSelectedDrive->bWasDeleted = true; Logger::logThis()->info("Finished delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); - ui->updateTUI(&listDrives, u8SelectedEntry); + ui->updateTUI(&listDrives, u16SelectedEntry); } } @@ -599,24 +600,24 @@ void reHDD::handleArrowKey(TUI::UserInput userInput) switch (userInput) { case TUI::UserInput::DownKey: - u8SelectedEntry++; - if (u8SelectedEntry >= u8EntrySize) + u16SelectedEntry++; + if (u16SelectedEntry >= u8EntrySize) { - u8SelectedEntry = 0; + u16SelectedEntry = 0; } break; case TUI::UserInput::UpKey: - if (u8SelectedEntry == 0) + if (u16SelectedEntry == 0) { - u8SelectedEntry = (u8EntrySize - 1); + u16SelectedEntry = (u8EntrySize - 1); } else { - u8SelectedEntry--; + u16SelectedEntry--; } break; default: - u8SelectedEntry = 0; + u16SelectedEntry = 0; break; } From 8872902990359ee9ffabe576016201a1c934d453 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:15:48 +0100 Subject: [PATCH 17/32] strcpy Without Bounds Checking --- src/printer.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/printer.cpp b/src/printer.cpp index a0313ef..59ea30f 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -44,10 +44,10 @@ void Printer::print(Drive *drive) snprintf(msgQueueData.driveData.caDriveIndex, STR_BUFFER_SIZE, "%i", drive->u16DriveIndex); snprintf(msgQueueData.driveData.caDriveState, STR_BUFFER_SIZE, "shredded"); - strcpy(msgQueueData.driveData.caDriveModelFamily, drive->getModelFamily().c_str()); - strcpy(msgQueueData.driveData.caDriveModelName, drive->getModelName().c_str()); + snprintf(msgQueueData.driveData.caDriveModelFamily, STR_BUFFER_SIZE, "%s", drive->getModelFamily().c_str()); + snprintf(msgQueueData.driveData.caDriveModelName, STR_BUFFER_SIZE, "%s", drive->getModelName().c_str()); snprintf(msgQueueData.driveData.caDriveCapacity, STR_BUFFER_SIZE, "%li", drive->getCapacity()); - strcpy(msgQueueData.driveData.caDriveSerialnumber, drive->getSerial().c_str()); + snprintf(msgQueueData.driveData.caDriveSerialnumber, STR_BUFFER_SIZE, "%s", drive->getSerial().c_str()); snprintf(msgQueueData.driveData.caDriveHours, STR_BUFFER_SIZE, "%i", drive->getPowerOnHours()); snprintf(msgQueueData.driveData.caDriveCycles, STR_BUFFER_SIZE, "%i", drive->getPowerCycles()); snprintf(msgQueueData.driveData.caDriveErrors, STR_BUFFER_SIZE, "%i", drive->getErrorCount()); @@ -57,17 +57,17 @@ void Printer::print(Drive *drive) switch (drive->connectionType) { case Drive::USB: - strcpy(msgQueueData.driveData.caDriveConnectionType, "usb"); + strncpy(msgQueueData.driveData.caDriveConnectionType, "usb", STR_BUFFER_SIZE); break; case Drive::SATA: - strcpy(msgQueueData.driveData.caDriveConnectionType, "sata"); + strncpy(msgQueueData.driveData.caDriveConnectionType, "sata", STR_BUFFER_SIZE); break; case Drive::NVME: - strcpy(msgQueueData.driveData.caDriveConnectionType, "nvme"); + strncpy(msgQueueData.driveData.caDriveConnectionType, "nvme", STR_BUFFER_SIZE); break; case Drive::UNKNOWN: default: - strcpy(msgQueueData.driveData.caDriveConnectionType, "na"); + strncpy(msgQueueData.driveData.caDriveConnectionType, "na", STR_BUFFER_SIZE); } snprintf(msgQueueData.driveData.caDriveReHddVersion, STR_BUFFER_SIZE, "%s", REHDD_VERSION); From f9d63a6a3f9af25c631b423441dcffcce43f7d8f Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:21:44 +0100 Subject: [PATCH 18/32] Mutex Not Held During List Size Check --- src/reHDD.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index fbfb119..dad66b4 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -92,16 +92,19 @@ void reHDD::app_logic(void) Drive *reHDD::getSelectedDrive() { + mxDrives.lock(); if (u16SelectedEntry < listDrives.size()) { list::iterator it = listDrives.begin(); advance(it, u16SelectedEntry); it->u16DriveIndex = u16SelectedEntry; + mxDrives.unlock(); return &(*it); } else { Logger::logThis()->warning("selected drive not present"); + mxDrives.unlock(); return nullptr; } } From c4cbcb99b58b39b1c197b48957a6a223c6169f4e Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:23:02 +0100 Subject: [PATCH 19/32] Signed/Unsigned Comparison --- src/reHDD.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reHDD.cpp b/src/reHDD.cpp index dad66b4..aa13b32 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -599,7 +599,7 @@ void reHDD::addSMARTData(list *plistDrives) void reHDD::handleArrowKey(TUI::UserInput userInput) { - int8_t u8EntrySize = (int8_t)listDrives.size(); + uint8_t u8EntrySize = (uint8_t)listDrives.size(); switch (userInput) { case TUI::UserInput::DownKey: From 228d8ecf6c37e8f00931c6a0abc450922762fed4 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:31:31 +0100 Subject: [PATCH 20/32] Missing Check for lseek Return Value --- include/shred.h | 2 +- src/shred.cpp | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/shred.h b/include/shred.h index 1d9af23..635f265 100644 --- a/include/shred.h +++ b/include/shred.h @@ -47,7 +47,7 @@ private: inline double calcProgress(); int iRewindDrive(fileDescriptor file); - unsigned long getDriveSizeInBytes(fileDescriptor file); + long getDriveSizeInBytes(fileDescriptor file); unsigned int uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSignalFd); void cleanup(); }; diff --git a/src/shred.cpp b/src/shred.cpp index 8fd3fae..906e908 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -239,19 +239,25 @@ int Shred::iRewindDrive(fileDescriptor file) } } -unsigned long Shred::getDriveSizeInBytes(fileDescriptor file) +long Shred::getDriveSizeInBytes(fileDescriptor file) { - unsigned long ulDriveSizeTmp = lseek(file, 0L, SEEK_END); + long liDriveSizeTmp = lseek(file, 0L, SEEK_END); + + if (liDriveSizeTmp == -1) + { + perror("unable to get drive size"); + return 0L; + } if (0 != iRewindDrive(file)) { - ulDriveSizeTmp = 0U; + liDriveSizeTmp = 0L; } #ifdef DEMO_DRIVE_SIZE - ulDriveSizeTmp = DEMO_DRIVE_SIZE; + liDriveSizeTmp = DEMO_DRIVE_SIZE; #endif - return ulDriveSizeTmp; + return liDriveSizeTmp; } unsigned int Shred::uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSignalFd) From 24d0eda1503bd6b496a8e1a6dde0b19d6da8611d Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:33:31 +0100 Subject: [PATCH 21/32] Deprecated sprintf in Logger --- src/logger/logger.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/logger/logger.cpp b/src/logger/logger.cpp index a91889b..49a727f 100644 --- a/src/logger/logger.cpp +++ b/src/logger/logger.cpp @@ -134,7 +134,7 @@ string Logger::getTimestamp() } timeinfo = localtime(&tv.tv_sec); strftime(cpDate, 80, "%d/%m/%Y %T", timeinfo); - sprintf(buffer, "%s.%03d", cpDate, millisec); + snprintf(buffer, sizeof(buffer), "%s.%03d", cpDate, millisec); return buffer; } @@ -156,8 +156,8 @@ string Logger::getMacAddress() unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; char buffer[80]; - sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], - hwaddr[3], hwaddr[4], hwaddr[5]); + snprintf(buffer, sizeof(buffer), "%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], + hwaddr[3], hwaddr[4], hwaddr[5]); close(s); string tmp = buffer; return tmp; From 2c45158ee8f6a147ec596135078f4c96859251c0 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:47:20 +0100 Subject: [PATCH 22/32] Unchecked ioctl Return Value --- include/logger/logger.h | 4 ++++ src/logger/logger.cpp | 46 +++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/include/logger/logger.h b/include/logger/logger.h index 8f883e2..0bbfc8c 100644 --- a/include/logger/logger.h +++ b/include/logger/logger.h @@ -16,6 +16,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include diff --git a/src/logger/logger.cpp b/src/logger/logger.cpp index 49a727f..75a06e4 100644 --- a/src/logger/logger.cpp +++ b/src/logger/logger.cpp @@ -143,24 +143,44 @@ string Logger::getTimestamp() * \param void * \return string MAC address (formatted) */ -string Logger::getMacAddress() +std::string Logger::getMacAddress() { - struct ifreq ifr; - int s = socket(AF_INET, SOCK_STREAM, 0); + struct ifaddrs *ifaddr, *ifa; - strcpy(ifr.ifr_name, "eth0"); - if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) + // default MAC if none found + std::string result = "00:00:00:00:00:00"; + + if (getifaddrs(&ifaddr) == -1) + return result; + + for (ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { - strcpy(ifr.ifr_name, "eno1"); + if (!ifa->ifa_addr) + continue; + + // We want AF_PACKET interfaces (Ethernet) + if (ifa->ifa_addr->sa_family == AF_PACKET && + !(ifa->ifa_flags & IFF_LOOPBACK) && // skip loopback interface + (ifa->ifa_flags & IFF_UP)) // must be up + { + struct sockaddr_ll *s = (struct sockaddr_ll *)ifa->ifa_addr; + + if (s->sll_halen == 6) + { + char buf[32]; + snprintf(buf, sizeof(buf), + "%02X:%02X:%02X:%02X:%02X:%02X", + s->sll_addr[0], s->sll_addr[1], s->sll_addr[2], + s->sll_addr[3], s->sll_addr[4], s->sll_addr[5]); + + freeifaddrs(ifaddr); + return std::string(buf); + } + } } - unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data; - char buffer[80]; - snprintf(buffer, sizeof(buffer), "%02X:%02X:%02X:%02X:%02X:%02X", hwaddr[0], hwaddr[1], hwaddr[2], - hwaddr[3], hwaddr[4], hwaddr[5]); - close(s); - string tmp = buffer; - return tmp; + freeifaddrs(ifaddr); + return result; } /** From e5506fd67e218eb84fcc57cbac0c342c22708c4d Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:51:47 +0100 Subject: [PATCH 23/32] Missing Validation of String Length --- src/smart.cpp | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/smart.cpp b/src/smart.cpp index 68df376..d420f28 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -36,10 +36,10 @@ void SMART::readSMARTData(Drive *drive) sCMD.append(drive->getPath()); const char *cpComand = sCMD.c_str(); - //Logger::logThis()->info(cpComand); + // Logger::logThis()->info(cpComand); FILE *outputfileSmart = popen(cpComand, "r"); - size_t len = 0U; // length of found line + size_t len = 0U; // length of found line char *cLine = NULL; // found line uint8_t status = 255U; @@ -63,7 +63,7 @@ void SMART::readSMARTData(Drive *drive) if (status == 0U) { // Found S.M.A.R.T. data with this command - //Logger::logThis()->info("Found S.M.A.R.T. data with this command"); + // Logger::logThis()->info("Found S.M.A.R.T. data with this command"); break; } } @@ -106,7 +106,10 @@ bool SMART::parseModelFamily(string sLine, string &modelFamily) if (found != string::npos) { sLine.erase(0U, sLine.find(": ") + 3U); - sLine.erase(sLine.length() - 3U, 3U); + if (sLine.length() >= 3U) + { + sLine.erase(sLine.length() - 3U, 3U); + } modelFamily = sLine; return true; } @@ -129,7 +132,10 @@ bool SMART::parseModelName(string sLine, string &modelName) if (found != string::npos) { sLine.erase(0U, sLine.find(": ") + 3U); - sLine.erase(sLine.length() - 3U, 3U); + if (sLine.length() >= 3U) + { + sLine.erase(sLine.length() - 3U, 3U); + } modelName = sLine; return true; } @@ -152,7 +158,10 @@ bool SMART::parseSerial(string sLine, string &serial) if (found != string::npos) { sLine.erase(0, sLine.find(": ") + 3); - sLine.erase(sLine.length() - 3, 3); + if (sLine.length() >= 3U) + { + sLine.erase(sLine.length() - 3U, 3U); + } serial = sLine; return true; } @@ -175,7 +184,10 @@ bool SMART::parseCapacity(string sLine, uint64_t &capacity) if (found != string::npos) { sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length() - 1, 1); + if (sLine.length() >= 1U) + { + sLine.erase(sLine.length() - 1U, 1U); + } capacity = stol(sLine); return true; } @@ -198,7 +210,10 @@ bool SMART::parseErrorCount(string sLine, uint32_t &errorCount) if (found != string::npos) { sLine.erase(0U, sLine.find(": ") + 2U); - sLine.erase(sLine.length() - 2U, 2U); + if (sLine.length() >= 2U) + { + sLine.erase(sLine.length() - 2U, 2U); + } errorCount = stol(sLine); return true; } @@ -221,7 +236,10 @@ bool SMART::parsePowerOnHours(string sLine, uint32_t &powerOnHours) if (found != string::npos) { sLine.erase(0U, sLine.find(": ") + 2U); - sLine.erase(sLine.length() - 1U, 1U); + if (sLine.length() >= 1U) + { + sLine.erase(sLine.length() - 1U, 1U); + } powerOnHours = stol(sLine); return true; } @@ -244,7 +262,10 @@ bool SMART::parsePowerCycles(string sLine, uint32_t &powerCycles) if (found != string::npos) { sLine.erase(0, sLine.find(": ") + 2); - sLine.erase(sLine.length() - 2, 2); + if (sLine.length() >= 2U) + { + sLine.erase(sLine.length() - 2U, 2U); + } powerCycles = stol(sLine); return true; } @@ -267,7 +288,10 @@ bool SMART::parseTemperature(string sLine, uint32_t &temperature) if (found != string::npos) { sLine.erase(0U, sLine.find(": ") + 2U); - sLine.erase(sLine.length() - 1U, 2U); + if (sLine.length() >= 1U) + { + sLine.erase(sLine.length() - 1U, 2U); + } if (sLine == "{") { temperature = 0U; // this drive doesn't support temperature From c9c4c0fac24906d609d4c835465caf66ec99508d Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:53:39 +0100 Subject: [PATCH 24/32] Missing Free for getline Allocated Memory --- src/delete.cpp | 2 ++ src/smart.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/src/delete.cpp b/src/delete.cpp index 94560ab..01f06b4 100644 --- a/src/delete.cpp +++ b/src/delete.cpp @@ -41,6 +41,8 @@ void Delete::deleteDrive(Drive *drive) { // wipefs running } + + free(cLine); pclose(deleteCmdOutput); } } diff --git a/src/smart.cpp b/src/smart.cpp index d420f28..334f21a 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -58,6 +58,7 @@ void SMART::readSMARTData(Drive *drive) SMART::parseTemperature(sLine, temperature); } + free(cLine); pclose(outputfileSmart); if (status == 0U) From 15014d8542d4494d452805ce881a1112ba8a03df Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:58:57 +0100 Subject: [PATCH 25/32] Global Using Namespace in Header --- include/drive.h | 34 +++++++++++++++++----------------- include/reHDD.h | 3 --- include/smart.h | 18 +++++++++--------- include/tui.h | 24 ++++++++++++------------ src/delete.cpp | 3 ++- src/drive.cpp | 1 + src/main.cpp | 1 + src/printer.cpp | 1 + src/reHDD.cpp | 1 + src/shred.cpp | 1 + src/smart.cpp | 1 + src/tui.cpp | 1 + 12 files changed, 47 insertions(+), 42 deletions(-) diff --git a/include/drive.h b/include/drive.h index eae0643..071b08a 100644 --- a/include/drive.h +++ b/include/drive.h @@ -50,7 +50,7 @@ public: uint16_t u16DriveIndex = 0U; // Index of TUI list private: - string sPath; + std::string sPath; time_t u32Timestamp = 0U; // unix timestamp for detecting a frozen drive double d32TaskPercentage = 0U; // in percent for Shred (1 to 100) time_t u32TimestampTaskStart = 0U; // unix timestamp for duration of an action @@ -58,9 +58,9 @@ private: struct { - string sModelFamily; - string sModelName; - string sSerial; + std::string sModelFamily; + std::string sModelName; + std::string sSerial; uint64_t u64Capacity = 0U; // in byte uint32_t u32ErrorCount = 0U; uint32_t u32PowerOnHours = 0U; // in hours @@ -73,15 +73,15 @@ private: protected: public: - Drive(string path) + Drive(std::string path) { this->sPath = path; } - string getPath(void); - string getModelFamily(void); - string getModelName(void); - string getSerial(void); + std::string getPath(void); + std::string getModelFamily(void); + std::string getModelName(void); + std::string getSerial(void); uint64_t getCapacity(void); // in byte uint32_t getErrorCount(void); uint32_t getPowerOnHours(void); // in hours @@ -89,20 +89,20 @@ public: uint32_t getTemperature(void); // in Fahrenheit, just kidding: degree Celsius void checkFrozenDrive(void); - void setDriveSMARTData(string modelFamily, - string modelName, - string serial, + void setDriveSMARTData(std::string modelFamily, + std::string modelName, + std::string serial, uint64_t capacity, uint32_t errorCount, uint32_t powerOnHours, uint32_t powerCycles, uint32_t temperature); - string sCapacityToText(); - string sErrorCountToText(); - string sPowerOnHoursToText(); - string sPowerCyclesToText(); - string sTemperatureToText(); + std::string sCapacityToText(); + std::string sErrorCountToText(); + std::string sPowerOnHoursToText(); + std::string sPowerCyclesToText(); + std::string sTemperatureToText(); void setTaskPercentage(double d32TaskPercentage); double getTaskPercentage(void); diff --git a/include/reHDD.h b/include/reHDD.h index ad23206..ee71711 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -56,9 +56,6 @@ #include #include #include - -using namespace std; - #include "drive.h" #include "smart.h" #include "shred.h" diff --git a/include/smart.h b/include/smart.h index 735f92e..2d4f4fd 100644 --- a/include/smart.h +++ b/include/smart.h @@ -19,15 +19,15 @@ public: private: SMART(void); - static bool parseExitStatus(string sLine, uint8_t &status); - static bool parseModelFamily(string sLine, string &modelFamily); - static bool parseModelName(string sLine, string &modelName); - static bool parseSerial(string sLine, string &serial); - static bool parseCapacity(string sLine, uint64_t &capacity); - static bool parseErrorCount(string sLine, uint32_t &errorCount); - static bool parsePowerOnHours(string sLine, uint32_t &powerOnHours); - static bool parsePowerCycles(string sLine, uint32_t &powerCycles); - static bool parseTemperature(string sLine, uint32_t &temperature); + static bool parseExitStatus(std::string sLine, uint8_t &status); + static bool parseModelFamily(std::string sLine, std::string &modelFamily); + static bool parseModelName(std::string sLine, std::string &modelName); + static bool parseSerial(std::string sLine, std::string &serial); + static bool parseCapacity(std::string sLine, uint64_t &capacity); + static bool parseErrorCount(std::string sLine, uint32_t &errorCount); + static bool parsePowerOnHours(std::string sLine, uint32_t &powerOnHours); + static bool parsePowerCycles(std::string sLine, uint32_t &powerCycles); + static bool parseTemperature(std::string sLine, uint32_t &temperature); }; #endif // SMART_H_ \ No newline at end of file diff --git a/include/tui.h b/include/tui.h index 9e671e6..d5585d5 100644 --- a/include/tui.h +++ b/include/tui.h @@ -47,16 +47,16 @@ public: static void initTUI(); - void updateTUI(list *plistDrives, uint8_t u8SelectedEntry); + void updateTUI(std::list *plistDrives, uint8_t u8SelectedEntry); static enum UserInput readUserInput(); static void terminateTUI(); private: - static string sCpuUsage; - static string sRamUsage; - static string sLocalTime; + static std::string sCpuUsage; + static std::string sRamUsage; + static std::string sLocalTime; WINDOW *overview; WINDOW *systemview; @@ -69,17 +69,17 @@ private: static WINDOW *createOverViewWindow(int iXSize, int iYSize); static WINDOW *createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive drive); static WINDOW *overwriteDetailViewWindow(int iXSize, int iYSize, int iXStart); - static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, string sModelFamily, string sSerial, string sCapacity, string sState, string sTime, string sSpeed, string sTemp, string sConnection, bool bSelected); + static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, std::string sModelFamily, std::string sSerial, std::string sCapacity, std::string sState, std::string sTime, std::string sSpeed, std::string sTemp, std::string sConnection, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); static WINDOW *createMenuView(int iXSize, int iYSize, int iXStart, int iYStart, struct MenuState menustate); - static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, string selectedTask, string optionA, string optionB); - static WINDOW *createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, string sProgress); - static WINDOW *createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount, uint32_t u32Temperature); - static WINDOW *createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, string sPath, string sModelFamily, string sModelName, string sSerial, uint32_t u32Checksum); + static WINDOW *createDialog(int iXSize, int iYSize, int iXStart, int iYStart, std::string selectedTask, std::string optionA, std::string optionB); + static WINDOW *createFrozenWarning(int iXSize, int iYSize, int iXStart, int iYStart, std::string sPath, std::string sModelFamily, std::string sModelName, std::string sSerial, std::string sProgress); + static WINDOW *createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, std::string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount, uint32_t u32Temperature); + static WINDOW *createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, std::string sPath, std::string sModelFamily, std::string sModelName, std::string sSerial, uint32_t u32Checksum); void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY); - string formatTimeDuration(time_t u32Duration); - string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); - static void vTruncateText(string *psText, uint16_t u16MaxLenght); + std::string formatTimeDuration(time_t u32Duration); + std::string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); + static void vTruncateText(std::string *psText, uint16_t u16MaxLenght); }; #endif // TUI_H_ diff --git a/src/delete.cpp b/src/delete.cpp index 01f06b4..ca7d63c 100644 --- a/src/delete.cpp +++ b/src/delete.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; /** * \brief delete drive with wipefs @@ -34,7 +35,7 @@ void Delete::deleteDrive(Drive *drive) if (drive->bWasShredStarted == false) { - //only start delete if the drive was not shredded before + // only start delete if the drive was not shredded before FILE *deleteCmdOutput = popen(cpComand, "r"); while ((getline(&cLine, &len, deleteCmdOutput)) != -1) diff --git a/src/drive.cpp b/src/drive.cpp index 5ae0b7e..56069df 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; string Drive::getPath(void) { diff --git a/src/main.cpp b/src/main.cpp index 5b1798d..fb91bcc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; /** * \brief app entry point diff --git a/src/printer.cpp b/src/printer.cpp index 59ea30f..ead3876 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; bool Printer::instanceFlag = false; Printer *Printer::single = NULL; diff --git a/src/reHDD.cpp b/src/reHDD.cpp index aa13b32..2156da9 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; static int fdNewDrivesInformPipe[2]; // File descriptor for pipe that informs if new drives are found diff --git a/src/shred.cpp b/src/shred.cpp index 906e908..5e5df7a 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; #ifdef __cplusplus extern "C" diff --git a/src/smart.cpp b/src/smart.cpp index 334f21a..2a10855 100644 --- a/src/smart.cpp +++ b/src/smart.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; /** * \brief get and set S.M.A.R.T. values in Drive diff --git a/src/tui.cpp b/src/tui.cpp index e011eb1..4ec6efa 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -6,6 +6,7 @@ */ #include "../include/reHDD.h" +using namespace std; static std::mutex mxUIrefresh; From c27471ae03696b503c26179cc3c220eb474bc36d Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 21:59:24 +0100 Subject: [PATCH 26/32] Unused Semicolon --- src/drive.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drive.cpp b/src/drive.cpp index 56069df..8a05b0e 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -104,7 +104,6 @@ string Drive::sPowerCyclesToText() string Drive::sTemperatureToText() { return to_string(getTemperature()) + " C"; - ; } void Drive::setTaskPercentage(double d32TaskPercentage) From acc05dac8b16e65c1b233e0d97807e376b1d83e9 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 9 Dec 2025 22:02:59 +0100 Subject: [PATCH 27/32] Potential Division by Zero --- src/printer.cpp | 2 +- src/shred.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/printer.cpp b/src/printer.cpp index ead3876..6bd043f 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -6,7 +6,7 @@ */ #include "../include/reHDD.h" -using namespace std; + bool Printer::instanceFlag = false; Printer *Printer::single = NULL; diff --git a/src/shred.cpp b/src/shred.cpp index 5e5df7a..5be6ce4 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -224,6 +224,8 @@ double Shred::calcProgress() #ifdef ZERO_CHECK uiMaxShredIteration++; // increment because we will check after SHRED_ITERATIONS the drive for non-zero bytes #endif + if (this->ulDriveByteSize == 0) + return 0.0; return (double)(((double)ulDriveByteOverallCount) / ((double)this->ulDriveByteSize * uiMaxShredIteration)) * 100.0f; } From a4f15460d31c5721c7a04feec93faa96a43b4d07 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 10 Dec 2025 20:40:48 +0100 Subject: [PATCH 28/32] make members atomic --- include/drive.h | 11 +++++++---- include/reHDD.h | 1 + include/tui.h | 4 ++-- src/drive.cpp | 2 +- src/printer.cpp | 9 ++++----- src/reHDD.cpp | 38 +++++++++++++++++++------------------- src/shred.cpp | 6 +++--- src/tui.cpp | 30 +++++++++++++++--------------- 8 files changed, 52 insertions(+), 49 deletions(-) diff --git a/include/drive.h b/include/drive.h index 071b08a..b766f5c 100644 --- a/include/drive.h +++ b/include/drive.h @@ -14,7 +14,7 @@ class Drive { public: - enum TaskState + enum class TaskState { NONE, SHRED_SELECTED, @@ -23,15 +23,15 @@ public: DELETE_SELECTED, DELETE_ACTIVE, FROZEN - } state; + }; - enum ConnectionType + enum class ConnectionType { UNKNOWN, USB, SATA, NVME - } connectionType; + }; struct { @@ -41,6 +41,9 @@ public: unsigned long ulSpeedMetricBytesWritten; } sShredSpeed; + std::atomic state; + std::atomic connectionType; + bool bWasShredded = false; // all shred iterations done bool bWasShredStarted = false; // shred was atleast once started bool bWasChecked = false; // all shred iterations and optional checking done diff --git a/include/reHDD.h b/include/reHDD.h index ee71711..01da1fd 100644 --- a/include/reHDD.h +++ b/include/reHDD.h @@ -56,6 +56,7 @@ #include #include #include +#include #include "drive.h" #include "smart.h" #include "shred.h" diff --git a/include/tui.h b/include/tui.h index d5585d5..7c170ac 100644 --- a/include/tui.h +++ b/include/tui.h @@ -67,7 +67,7 @@ private: static void centerTitle(WINDOW *pwin, const char *title); static WINDOW *createOverViewWindow(int iXSize, int iYSize); - static WINDOW *createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive drive); + static WINDOW *createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive &drive); static WINDOW *overwriteDetailViewWindow(int iXSize, int iYSize, int iXStart); static WINDOW *createEntryWindow(int iXSize, int iYSize, int iXStart, int iYStart, int iListIndex, std::string sModelFamily, std::string sSerial, std::string sCapacity, std::string sState, std::string sTime, std::string sSpeed, std::string sTemp, std::string sConnection, bool bSelected); static WINDOW *createSystemStats(int iXSize, int iYSize, int iXStart, int iYStart); @@ -77,7 +77,7 @@ private: static WINDOW *createSmartWarning(int iXSize, int iYSize, int iXStart, int iYStart, std::string sPath, uint32_t u32PowerOnHours, uint32_t u32PowerCycles, uint32_t u32ErrorCount, uint32_t u32Temperature); static WINDOW *createZeroChecksumWarning(int iXSize, int iYSize, int iXStart, int iYStart, std::string sPath, std::string sModelFamily, std::string sModelName, std::string sSerial, uint32_t u32Checksum); - void displaySelectedDrive(Drive drive, int stdscrX, int stdscrY); + void displaySelectedDrive(Drive &drive, int stdscrX, int stdscrY); std::string formatTimeDuration(time_t u32Duration); std::string formatSpeed(time_t u32ShredTimeDelta, unsigned long ulWrittenBytes); static void vTruncateText(std::string *psText, uint16_t u16MaxLenght); diff --git a/src/drive.cpp b/src/drive.cpp index 8a05b0e..71af4da 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -205,6 +205,6 @@ void Drive::checkFrozenDrive(void) Logger::logThis()->warning("Drive Frozen: " + this->getModelName() + " " + this->getSerial()); this->bWasDeleted = false; this->bWasShredded = false; - this->state = Drive::FROZEN; + this->state = Drive::TaskState::FROZEN; } } \ No newline at end of file diff --git a/src/printer.cpp b/src/printer.cpp index 6bd043f..c69433c 100644 --- a/src/printer.cpp +++ b/src/printer.cpp @@ -7,7 +7,6 @@ #include "../include/reHDD.h" - bool Printer::instanceFlag = false; Printer *Printer::single = NULL; @@ -57,16 +56,16 @@ void Printer::print(Drive *drive) switch (drive->connectionType) { - case Drive::USB: + case Drive::ConnectionType::USB: strncpy(msgQueueData.driveData.caDriveConnectionType, "usb", STR_BUFFER_SIZE); break; - case Drive::SATA: + case Drive::ConnectionType::SATA: strncpy(msgQueueData.driveData.caDriveConnectionType, "sata", STR_BUFFER_SIZE); break; - case Drive::NVME: + case Drive::ConnectionType::NVME: strncpy(msgQueueData.driveData.caDriveConnectionType, "nvme", STR_BUFFER_SIZE); break; - case Drive::UNKNOWN: + case Drive::ConnectionType::UNKNOWN: default: strncpy(msgQueueData.driveData.caDriveConnectionType, "na", STR_BUFFER_SIZE); } diff --git a/src/reHDD.cpp b/src/reHDD.cpp index 2156da9..abd5ab1 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -133,7 +133,7 @@ void reHDD::ThreadCheckFrozenDrives() mxDrives.lock(); for (auto it = begin(listDrives); it != end(listDrives); ++it) { - if (it->state == Drive::SHRED_ACTIVE) + if (it->state == Drive::TaskState::SHRED_ACTIVE) { it->checkFrozenDrive(); } @@ -175,9 +175,9 @@ void reHDD::ThreadUserInput() if (tmpSelectedDrive != nullptr) { - if (tmpSelectedDrive->state == Drive::NONE) + if (tmpSelectedDrive->state == Drive::TaskState::NONE) { - tmpSelectedDrive->state = Drive::DELETE_SELECTED; + tmpSelectedDrive->state = Drive::TaskState::DELETE_SELECTED; } } @@ -187,9 +187,9 @@ void reHDD::ThreadUserInput() // cout << "Shred" << endl; if (tmpSelectedDrive != nullptr) { - if (tmpSelectedDrive->state == Drive::NONE) + if (tmpSelectedDrive->state == Drive::TaskState::NONE) { - tmpSelectedDrive->state = Drive::SHRED_SELECTED; + tmpSelectedDrive->state = Drive::TaskState::SHRED_SELECTED; } } ui->updateTUI(&listDrives, u16SelectedEntry); @@ -302,7 +302,7 @@ void reHDD::filterNewDrives(list *plistOldDrives, list *plistNewDr { // cout << "offline drive found: " << itOld->getPath() << endl; Logger::logThis()->warning("Mark offline drive found: " + itOld->getPath()); - itOld->state = Drive::NONE; // clear state --> shred task will terminate + itOld->state = Drive::TaskState::NONE; // clear state --> shred task will terminate } } @@ -340,26 +340,26 @@ void reHDD::searchDrives(std::list *plistDrives) continue; Drive tmpDrive("/dev/" + devName); - tmpDrive.state = Drive::NONE; + tmpDrive.state = Drive::TaskState::NONE; tmpDrive.bIsOffline = false; // Set connection type if (transport == "sata") - tmpDrive.connectionType = Drive::SATA; + tmpDrive.connectionType = Drive::ConnectionType::SATA; else if (transport == "usb") - tmpDrive.connectionType = Drive::USB; + tmpDrive.connectionType = Drive::ConnectionType::USB; else if (transport == "nvme") - tmpDrive.connectionType = Drive::NVME; + tmpDrive.connectionType = Drive::ConnectionType::NVME; else - tmpDrive.connectionType = Drive::UNKNOWN; + tmpDrive.connectionType = Drive::ConnectionType::UNKNOWN; plistDrives->push_back(tmpDrive); Logger::logThis()->info( "Drive found: " + tmpDrive.getPath() + " (type: " + - (tmpDrive.connectionType == Drive::USB ? "USB" : tmpDrive.connectionType == Drive::SATA ? "SATA" - : tmpDrive.connectionType == Drive::NVME ? "NVME" + (tmpDrive.connectionType == Drive::ConnectionType::USB ? "USB" : tmpDrive.connectionType == Drive::ConnectionType::SATA ? "SATA" + : tmpDrive.connectionType == Drive::ConnectionType::NVME ? "NVME" : "UNKNOWN") + ")"); } @@ -478,7 +478,7 @@ void reHDD::startShredAllDrives(list *plistDrives) mxDrives.lock(); for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { - if (it->state == Drive::NONE) + if (it->state == Drive::TaskState::NONE) { Drive *pTmpDrive = iterator_to_pointer::iterator>(it); #ifdef LOG_LEVEL_HIGH @@ -505,9 +505,9 @@ void reHDD::stopShredAllDrives(list *plistDrives) for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { - if (it->state == Drive::SHRED_ACTIVE || it->state == Drive::DELETE_ACTIVE) + if (it->state == Drive::TaskState::SHRED_ACTIVE || it->state == Drive::TaskState::DELETE_ACTIVE) { - it->state = Drive::NONE; + it->state = Drive::TaskState::NONE; Logger::logThis()->info("Abort-Shred-Signal for: " + it->getModelName() + "-" + it->getSerial()); // task for drive is running --> remove selection } @@ -566,7 +566,7 @@ void reHDD::updateShredMetrics(list *plistDrives) list::iterator it; for (it = plistDrives->begin(); it != plistDrives->end(); ++it) { - if (it->state == Drive::SHRED_ACTIVE) + if (it->state == Drive::TaskState::SHRED_ACTIVE) { Drive *pTmpDrive = iterator_to_pointer::iterator>(it); // set metrics for calculating shred speed @@ -675,9 +675,9 @@ void reHDD::handleAbort() Drive *tmpSelectedDrive = getSelectedDrive(); if (tmpSelectedDrive != nullptr) { - if (tmpSelectedDrive->state == Drive::SHRED_ACTIVE || tmpSelectedDrive->state == Drive::DELETE_ACTIVE) + if (tmpSelectedDrive->state == Drive::TaskState::SHRED_ACTIVE || tmpSelectedDrive->state == Drive::TaskState::DELETE_ACTIVE) { - tmpSelectedDrive->state = Drive::NONE; + tmpSelectedDrive->state = Drive::TaskState::NONE; Logger::logThis()->info("Abort-Shred-Signal for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial()); // task for drive is running --> remove selection } diff --git a/src/shred.cpp b/src/shred.cpp index 5be6ce4..85d4184 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -42,7 +42,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) #ifdef DRYRUN for (int i = 0; i <= 500; i++) { - if (drive->state != Drive::SHRED_ACTIVE) + if (drive->state.load() != Drive::TaskState::SHRED_ACTIVE) { return 0; } @@ -202,9 +202,9 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) cleanup(); - if ((drive->state == Drive::SHRED_ACTIVE) || (drive->state == Drive::CHECK_ACTIVE)) + if ((drive->state.load() == Drive::TaskState::SHRED_ACTIVE) || (drive->state.load() == Drive::TaskState::CHECK_ACTIVE)) { - drive->state = Drive::NONE; + drive->state = Drive::TaskState::NONE; drive->setTaskPercentage(0.0); Printer::getPrinter()->print(drive); Logger::logThis()->info("Finished shred/check for: " + drive->getModelName() + "-" + drive->getSerial()); diff --git a/src/tui.cpp b/src/tui.cpp index 4ec6efa..cebc317 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -122,7 +122,7 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) switch (it->state) { - case Drive::SHRED_ACTIVE: + case Drive::TaskState::SHRED_ACTIVE: stream << fixed << setprecision(3) << (it->getTaskPercentage()); sState = "Shredding: " + stream.str() + "%"; @@ -131,21 +131,21 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) sTime = this->formatTimeDuration(it->getTaskDuration()); sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); break; - case Drive::CHECK_ACTIVE: + case Drive::TaskState::CHECK_ACTIVE: stream << fixed << setprecision(3) << (it->getTaskPercentage()); sState = "Checking: " + stream.str() + "%"; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); break; - case Drive::DELETE_ACTIVE: + case Drive::TaskState::DELETE_ACTIVE: sState = "Deleting ..."; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); break; - case Drive::NONE: - case Drive::SHRED_SELECTED: - case Drive::DELETE_SELECTED: + case Drive::TaskState::NONE: + case Drive::TaskState::SHRED_SELECTED: + case Drive::TaskState::DELETE_SELECTED: if (it->bWasDeleted) { sState = "DELETED"; // mark drive as deleted previously @@ -174,7 +174,7 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) #endif break; - case Drive::FROZEN: + case Drive::TaskState::FROZEN: stream << fixed << setprecision(3) << (it->getTaskPercentage()); #ifdef FROZEN_ALERT if (bSelectedEntry) @@ -290,7 +290,7 @@ WINDOW *TUI::createOverViewWindow(int iXSize, int iYSize) return newWindow; } -WINDOW *TUI::createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive drive) +WINDOW *TUI::createDetailViewWindow(int iXSize, int iYSize, int iXStart, Drive &drive) { WINDOW *newWindow; newWindow = newwin(iYSize, iXSize, 1, iXStart); @@ -633,7 +633,7 @@ void TUI::vTruncateText(string *psText, uint16_t u16MaxLenght) } } -void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) +void TUI::displaySelectedDrive(Drive &drive, int stdscrX, int stdscrY) { struct MenuState menustate; static bool dialogIsActive; @@ -646,27 +646,27 @@ void TUI::displaySelectedDrive(Drive drive, int stdscrX, int stdscrY) // set menustate based on drive state switch (drive.state) { - case Drive::NONE: // no task running or selected for this drive + case Drive::TaskState::NONE: // no task running or selected for this drive menustate.bShred = true; menustate.bDelete = true; break; - case Drive::DELETE_ACTIVE: // delete task running for this drive + case Drive::TaskState::DELETE_ACTIVE: // delete task running for this drive menustate.bAbort = true; break; - case Drive::SHRED_ACTIVE: // shred task running for this drive + case Drive::TaskState::SHRED_ACTIVE: // shred task running for this drive menustate.bAbort = true; break; - case Drive::CHECK_ACTIVE: // check task running for this drive + case Drive::TaskState::CHECK_ACTIVE: // check task running for this drive menustate.bAbort = true; break; - case Drive::DELETE_SELECTED: // delete task selected for this drive + case Drive::TaskState::DELETE_SELECTED: // delete task selected for this drive menustate.bConfirmDelete = true; break; - case Drive::SHRED_SELECTED: // shred task selected for this drive + case Drive::TaskState::SHRED_SELECTED: // shred task selected for this drive menustate.bConfirmShred = true; break; default: From 4b0ec380b16f1e1d433a822a6345650059502ac6 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 10 Dec 2025 21:15:39 +0100 Subject: [PATCH 29/32] fix atomic --- include/drive.h | 20 +++++++++-- makefile | 2 +- src/drive.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ src/reHDD.cpp | 16 +++++---- src/shred.cpp | 4 ++- src/tui.cpp | 23 +++++++++---- 6 files changed, 134 insertions(+), 19 deletions(-) diff --git a/include/drive.h b/include/drive.h index b766f5c..ffae208 100644 --- a/include/drive.h +++ b/include/drive.h @@ -33,16 +33,18 @@ public: NVME }; - struct + struct ShredSpeed { time_t u32ShredTimeDelta; - std::chrono::time_point chronoShredTimestamp; + std::chrono::time_point + chronoShredTimestamp; unsigned long ulWrittenBytes; unsigned long ulSpeedMetricBytesWritten; - } sShredSpeed; + }; std::atomic state; std::atomic connectionType; + std::atomic sShredSpeed; bool bWasShredded = false; // all shred iterations done bool bWasShredStarted = false; // shred was atleast once started @@ -76,6 +78,18 @@ private: protected: public: + // Copy constructor + Drive(const Drive &other); + + // Copy assignment operator + Drive &operator=(const Drive &other); + + // Move constructor + Drive(Drive &&other) noexcept; + + // Move assignment operator + Drive &operator=(Drive &&other) noexcept; + Drive(std::string path) { this->sPath = path; diff --git a/makefile b/makefile index 8d1f7fd..6abaa7e 100644 --- a/makefile +++ b/makefile @@ -18,7 +18,7 @@ DCOMPILE_FLAGS = -D DEBUG # Add additional include paths INCLUDES = include # General linker settings -LINK_FLAGS = -Llib -lpthread -lncurses -ltfng +LINK_FLAGS = -Llib -lpthread -lncurses -ltfng -latomic # Doc DOCDIR = doc diff --git a/src/drive.cpp b/src/drive.cpp index 71af4da..c1683ce 100644 --- a/src/drive.cpp +++ b/src/drive.cpp @@ -8,6 +8,94 @@ #include "../include/reHDD.h" using namespace std; +// Copy constructor +Drive::Drive(const Drive &other) + : state(other.state.load()), + connectionType(other.connectionType.load()), + sShredSpeed(other.sShredSpeed.load()), + bWasShredded(other.bWasShredded), + bWasShredStarted(other.bWasShredStarted), + bWasChecked(other.bWasChecked), + bWasDeleted(other.bWasDeleted), + bIsOffline(other.bIsOffline), + u32DriveChecksumAfterShredding(other.u32DriveChecksumAfterShredding), + sPath(other.sPath), + u32Timestamp(other.u32Timestamp), + d32TaskPercentage(other.d32TaskPercentage), + u32TimestampTaskStart(other.u32TimestampTaskStart), + u32TaskDuration(other.u32TaskDuration), + sSmartData(other.sSmartData) +{ +} + +// Copy assignment operator +Drive &Drive::operator=(const Drive &other) +{ + if (this != &other) + { + state = other.state.load(); + connectionType = other.connectionType.load(); + sShredSpeed = other.sShredSpeed.load(); + bWasShredded = other.bWasShredded; + bWasShredStarted = other.bWasShredStarted; + bWasChecked = other.bWasChecked; + bWasDeleted = other.bWasDeleted; + bIsOffline = other.bIsOffline; + u32DriveChecksumAfterShredding = other.u32DriveChecksumAfterShredding; + sPath = other.sPath; + u32Timestamp = other.u32Timestamp; + d32TaskPercentage = other.d32TaskPercentage; + u32TimestampTaskStart = other.u32TimestampTaskStart; + u32TaskDuration = other.u32TaskDuration; + sSmartData = other.sSmartData; + } + return *this; +} + +// Move constructor +Drive::Drive(Drive &&other) noexcept + : state(other.state.load()), + connectionType(other.connectionType.load()), + sShredSpeed(other.sShredSpeed.load()), + bWasShredded(other.bWasShredded), + bWasShredStarted(other.bWasShredStarted), + bWasChecked(other.bWasChecked), + bWasDeleted(other.bWasDeleted), + bIsOffline(other.bIsOffline), + u32DriveChecksumAfterShredding(other.u32DriveChecksumAfterShredding), + sPath(std::move(other.sPath)), + u32Timestamp(other.u32Timestamp), + d32TaskPercentage(other.d32TaskPercentage), + u32TimestampTaskStart(other.u32TimestampTaskStart), + u32TaskDuration(other.u32TaskDuration), + sSmartData(std::move(other.sSmartData)) +{ +} + +// Move assignment operator +Drive &Drive::operator=(Drive &&other) noexcept +{ + if (this != &other) + { + state = other.state.load(); + connectionType = other.connectionType.load(); + sShredSpeed = other.sShredSpeed.load(); + bWasShredded = other.bWasShredded; + bWasShredStarted = other.bWasShredStarted; + bWasChecked = other.bWasChecked; + bWasDeleted = other.bWasDeleted; + bIsOffline = other.bIsOffline; + u32DriveChecksumAfterShredding = other.u32DriveChecksumAfterShredding; + sPath = std::move(other.sPath); + u32Timestamp = other.u32Timestamp; + d32TaskPercentage = other.d32TaskPercentage; + u32TimestampTaskStart = other.u32TimestampTaskStart; + u32TaskDuration = other.u32TaskDuration; + sSmartData = std::move(other.sSmartData); + } + return *this; +} + string Drive::getPath(void) { return sPath; diff --git a/src/reHDD.cpp b/src/reHDD.cpp index abd5ab1..57cd30a 100644 --- a/src/reHDD.cpp +++ b/src/reHDD.cpp @@ -359,8 +359,8 @@ void reHDD::searchDrives(std::list *plistDrives) "Drive found: " + tmpDrive.getPath() + " (type: " + (tmpDrive.connectionType == Drive::ConnectionType::USB ? "USB" : tmpDrive.connectionType == Drive::ConnectionType::SATA ? "SATA" - : tmpDrive.connectionType == Drive::ConnectionType::NVME ? "NVME" - : "UNKNOWN") + + : tmpDrive.connectionType == Drive::ConnectionType::NVME ? "NVME" + : "UNKNOWN") + ")"); } @@ -571,13 +571,15 @@ void reHDD::updateShredMetrics(list *plistDrives) Drive *pTmpDrive = iterator_to_pointer::iterator>(it); // set metrics for calculating shred speed std::chrono::time_point chronoCurrentTimestamp = std::chrono::system_clock::now(); - time_t u32ShredTimeDelta = (chronoCurrentTimestamp - pTmpDrive->sShredSpeed.chronoShredTimestamp).count(); + auto shredSpeed = pTmpDrive->sShredSpeed.load(); + time_t u32ShredTimeDelta = (chronoCurrentTimestamp - shredSpeed.chronoShredTimestamp).count(); if (u32ShredTimeDelta > METRIC_THRESHOLD) { - pTmpDrive->sShredSpeed.u32ShredTimeDelta = u32ShredTimeDelta; - pTmpDrive->sShredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); - pTmpDrive->sShredSpeed.ulWrittenBytes = pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten; - pTmpDrive->sShredSpeed.ulSpeedMetricBytesWritten = 0U; + shredSpeed.u32ShredTimeDelta = u32ShredTimeDelta; + shredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); + shredSpeed.ulWrittenBytes = shredSpeed.ulSpeedMetricBytesWritten; + shredSpeed.ulSpeedMetricBytesWritten = 0U; + pTmpDrive->sShredSpeed.store(shredSpeed); } } } diff --git a/src/shred.cpp b/src/shred.cpp index 85d4184..99c3b36 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -286,7 +286,9 @@ unsigned int Shred::uiCalcChecksum(fileDescriptor file, Drive *drive, int *ipSig ulDriveByteCounter += iReadBytes; ulDriveByteOverallCount += iReadBytes; d32Percent = this->calcProgress(); - drive->sShredSpeed.ulSpeedMetricBytesWritten += iReadBytes; + auto shredSpeed = drive->sShredSpeed.load(); + shredSpeed.ulSpeedMetricBytesWritten += iReadBytes; + drive->sShredSpeed.store(shredSpeed); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task (Checksum): ByteCount: " + to_string(ulDriveByteCounter) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); diff --git a/src/tui.cpp b/src/tui.cpp index cebc317..c70469c 100644 --- a/src/tui.cpp +++ b/src/tui.cpp @@ -99,9 +99,9 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) string sSpeed = " "; string sTime = " "; string sTemp = it->sTemperatureToText(); - string sConnection = (it->connectionType == Drive::USB ? "USB" : it->connectionType == Drive::SATA ? "SATA" - : it->connectionType == Drive::NVME ? "NVME" - : ""); + string sConnection = (it->connectionType == Drive::ConnectionType::USB ? "USB" : it->connectionType == Drive::ConnectionType::SATA ? "SATA" + : it->connectionType == Drive::ConnectionType::NVME ? "NVME" + : ""); bool bSelectedEntry = false; @@ -123,29 +123,38 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) switch (it->state) { case Drive::TaskState::SHRED_ACTIVE: - + { stream << fixed << setprecision(3) << (it->getTaskPercentage()); sState = "Shredding: " + stream.str() + "%"; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); - sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); + auto shredSpeed = it->sShredSpeed.load(); + sSpeed = this->formatSpeed(shredSpeed.u32ShredTimeDelta, shredSpeed.ulWrittenBytes); break; + } case Drive::TaskState::CHECK_ACTIVE: + { stream << fixed << setprecision(3) << (it->getTaskPercentage()); sState = "Checking: " + stream.str() + "%"; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); - sSpeed = this->formatSpeed(it->sShredSpeed.u32ShredTimeDelta, it->sShredSpeed.ulWrittenBytes); + auto shredSpeed = it->sShredSpeed.load(); + sSpeed = this->formatSpeed(shredSpeed.u32ShredTimeDelta, shredSpeed.ulWrittenBytes); break; + } case Drive::TaskState::DELETE_ACTIVE: + { + sState = "Deleting ..."; it->calculateTaskDuration(); sTime = this->formatTimeDuration(it->getTaskDuration()); break; + } case Drive::TaskState::NONE: case Drive::TaskState::SHRED_SELECTED: case Drive::TaskState::DELETE_SELECTED: + { if (it->bWasDeleted) { sState = "DELETED"; // mark drive as deleted previously @@ -172,8 +181,8 @@ void TUI::updateTUI(list *plistDrives, uint8_t u8SelectedEntry) wrefresh(dialog); } #endif - break; + } case Drive::TaskState::FROZEN: stream << fixed << setprecision(3) << (it->getTaskPercentage()); #ifdef FROZEN_ALERT From cbf781f0e5944d7d18147044dc2a353fabc4c697 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 10 Dec 2025 21:37:14 +0100 Subject: [PATCH 30/32] fix prod build --- include/reHDD.h | 2 +- src/shred.cpp | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/reHDD.h b/include/reHDD.h index 01da1fd..059e199 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/shred.cpp b/src/shred.cpp index 99c3b36..5938bf3 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -93,8 +93,10 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) tfng_prng_seedkey(ucKey); 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::ShredSpeed shredSpeed = drive->sShredSpeed.load(); + shredSpeed.chronoShredTimestamp = std::chrono::system_clock::now(); // set inital timestamp for speed metric + shredSpeed.ulSpeedMetricBytesWritten = 0U; // uses to calculate speed metric + drive->sShredSpeed.store(shredSpeed); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: Bytes-Size of Drive: " + to_string(this->ulDriveByteSize) + " - Drive: " + drive->getSerial()); @@ -140,14 +142,15 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) return -1; } - ulDriveByteCounter += iByteShredded; - ulDriveByteOverallCount += iByteShredded; - d32Percent = this->calcProgress(); - drive->sShredSpeed.ulSpeedMetricBytesWritten += iByteShredded; + auto shredSpeed = drive->sShredSpeed.load(); + shredSpeed.ulSpeedMetricBytesWritten += iByteShredded; + drive->sShredSpeed.store(shredSpeed); + d32Percent = this->calcProgress(); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter + 1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); #endif + if ((d32Percent - d32TmpPercent) >= 0.01) { // set shred percantage @@ -157,7 +160,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) write(*ipSignalFd, "A", 1); } - if (drive->state != Drive::SHRED_ACTIVE) + if (drive->state != Drive::TaskState::SHRED_ACTIVE) { drive->setTaskPercentage(0); d32Percent = 0.00; @@ -184,7 +187,7 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) drive->bWasShredded = true; Logger::logThis()->info("Shred-Task finished - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); #ifdef ZERO_CHECK - drive->state = Drive::CHECK_ACTIVE; + drive->state = Drive::TaskState::CHECK_ACTIVE; Logger::logThis()->info("Check-Task started - Drive: " + drive->getModelName() + "-" + drive->getSerial() + " @" + address.str()); drive->u32DriveChecksumAfterShredding = uiCalcChecksum(driveFileDiscr, drive, ipSignalFd); #ifdef LOG_LEVEL_HIGH From 26c42a7e5d4d7a05bb992c63daaa4f36df7d2f56 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 10 Dec 2025 21:44:27 +0100 Subject: [PATCH 31/32] fix shred bytes counters --- src/shred.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/shred.cpp b/src/shred.cpp index 5938bf3..f46156d 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -146,6 +146,8 @@ int Shred::shredDrive(Drive *drive, int *ipSignalFd) shredSpeed.ulSpeedMetricBytesWritten += iByteShredded; drive->sShredSpeed.store(shredSpeed); + ulDriveByteCounter += iByteShredded; + ulDriveByteOverallCount += iByteShredded; d32Percent = this->calcProgress(); #ifdef LOG_LEVEL_HIGH Logger::logThis()->info("Shred-Task: ByteCount: " + to_string(ulDriveByteCounter) + " - iteration: " + to_string((uiShredIterationCounter + 1)) + " - progress: " + to_string(d32Percent) + " - Drive: " + drive->getSerial()); From 9aca86af0c9c683dc1629519409eba4cd4cc4b8c Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 10 Dec 2025 21:49:44 +0100 Subject: [PATCH 32/32] add call to logger --- src/shred.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/shred.cpp b/src/shred.cpp index f46156d..71b166d 100644 --- a/src/shred.cpp +++ b/src/shred.cpp @@ -239,6 +239,7 @@ int Shred::iRewindDrive(fileDescriptor file) if (0 != lseek(file, 0L, SEEK_SET)) { perror("unable to rewind drive"); + Logger::logThis()->info("Unable to rewind drive! - fileDescriptor: " + to_string(file)); return -1; } else @@ -254,6 +255,7 @@ long Shred::getDriveSizeInBytes(fileDescriptor file) if (liDriveSizeTmp == -1) { perror("unable to get drive size"); + Logger::logThis()->info("Unable to get drive size! - fileDescriptor: " + to_string(file)); return 0L; }