From c00a451f6c905981c343d8fdf4834a19ae3aa4cf Mon Sep 17 00:00:00 2001 From: Floris Bos Date: Wed, 16 Feb 2022 12:09:47 +0100 Subject: [PATCH] gz/xz/zstd custom images: pad if image size is not dividable by 512 bytes Disk image sizes that are not dividable by 512 bytes should not exist, as that is the minimum sector size any disk can have, and the smallest unit an OS can write to a disk. We were already rejecting such image files if we know in advance the size was wrong, which we can test if they are uncompressed, if they are in an easy parsable file format such as .zip, or if the repository meta data indicated the uncompressed size. However for gz/xz/zstd files this check is not done, and it would fail at the verification stage instead. If encountering such corner case, pad the image instead of failing. Ref #364 --- src/downloadextractthread.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/downloadextractthread.cpp b/src/downloadextractthread.cpp index cd6544b..2413cc3 100644 --- a/src/downloadextractthread.cpp +++ b/src/downloadextractthread.cpp @@ -151,6 +151,14 @@ void DownloadExtractThread::extractImageRun() throw runtime_error(archive_error_string(a)); if (size == 0) break; + if (size % 512 != 0) + { + size_t paddingBytes = 512-(size % 512); + qDebug() << "Image is NOT a valid disk image, as its length is not a multiple of the sector size of 512 bytes long"; + qDebug() << "Last write() would be" << size << "bytes, but padding to" << size + paddingBytes << "bytes"; + memset(_abuf[_activeBuf]+size, 0, paddingBytes); + size += paddingBytes; + } if (_writeThreadStarted) {