From cf85ca788a53c3a45b383edeabd843e319706de3 Mon Sep 17 00:00:00 2001 From: Imbus Date: Sat, 7 Feb 2026 13:23:53 +0100 Subject: [PATCH] Verification logic now verifies both by-block and crc32 --- writeimg.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/writeimg.c b/writeimg.c index c83ce29..538f480 100644 --- a/writeimg.c +++ b/writeimg.c @@ -1,3 +1,4 @@ +#include "crc32.h" #include #include #include @@ -73,10 +74,13 @@ int perform_write(write_job_t *job) { /* TODO: Checks */ assert(job->bufsize >= job->block_size); + int crc = crc32_init(); + while (!job->verify_only) { ssize_t read_bytes = read(file_fd, job->buffer, job->block_size); if (read_bytes == 0) { fsync(block_fd); + crc = crc32_finalize(crc); break; /* Finished */ } @@ -86,6 +90,8 @@ int perform_write(write_job_t *job) { exit(EXIT_FAILURE); } + crc = crc32_update(crc, job->buffer, read_bytes); + ssize_t written_bytes = write(block_fd, job->buffer, read_bytes); if (written_bytes < 0) { fprintf(stderr, "%s: Write error\n", job->dev_name); @@ -100,6 +106,8 @@ int perform_write(write_job_t *job) { memset(job->buffer, 0, BLOCKSIZE); memset(job->buffer2, 0, BLOCKSIZE); + int crc_back = crc32_init(); + while (1) { ssize_t read_file = read(file_fd, job->buffer2, job->block_size); ssize_t read_block = read(block_fd, job->buffer, read_file); @@ -108,8 +116,13 @@ int perform_write(write_job_t *job) { assert(read_block >= 0); assert(read_file >= 0); - if (read_file == 0) + if (read_file == 0) { + crc_back = crc32_finalize(crc_back); + assert(crc_back == crc); break; + } + + crc_back = crc32_update(crc_back, job->buffer, read_file); int cmp = memcmp((const void *)job->buffer2, (const void *)job->buffer, (size_t)read_file); if (0 != cmp) {