From 9c1360ad056f0fc7c43d9b826af82ffd8c315d47 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Mon, 10 Nov 2025 12:52:09 +0100 Subject: [PATCH] fix(checksums): avoid crash on aborted checksum calculation job In case a propagation job is aborted while it's about to start computing the content checksum in a thread, the thread could still be started and attempting to call `_checksumCalculator->calculate()`. As the job was aborted the ComputeChecksum instance has already been deleted along with its ChecksumCalculator instance, and the thread ends up calling `calculate()` on an invalid pointer. I managed to occasionally reproduce this through: auto computeChecksum = new ComputeChecksum(); computeChecksum->setChecksumType("MD5"); computeChecksum->start("/dev/zero"); delete computeChecksum; Signed-off-by: Jyrki Gadinger --- src/common/checksums.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/common/checksums.cpp b/src/common/checksums.cpp index d3d71f5e89e30..e0d992dfe79ec 100644 --- a/src/common/checksums.cpp +++ b/src/common/checksums.cpp @@ -175,7 +175,10 @@ ComputeChecksum::ComputeChecksum(QObject *parent) { } -ComputeChecksum::~ComputeChecksum() = default; +ComputeChecksum::~ComputeChecksum() +{ + _checksumCalculator.reset(); +} void ComputeChecksum::setChecksumType(const QByteArray &type) { @@ -201,6 +204,11 @@ void ComputeChecksum::startImpl(const QString &filePath) _checksumCalculator.reset(new ChecksumCalculator(filePath, _checksumType)); _watcher.setFuture(QtConcurrent::run([this]() { + if (!_checksumCalculator) { + qCDebug(lcChecksums) << "checksumCalculator instance was destroyed before calculation started, returning empty checksum"; + return QByteArray(); + } + return _checksumCalculator->calculate(); })); }