tytso / e2fsprogs

Ext2/3/4 file system utilities
http://ext4.wiki.kernel.org
374 stars 221 forks source link

ext2simg: Fix off-by-one errors causing corruption #116

Open MQueiros opened 2 years ago

MQueiros commented 2 years ago

If your filesystem is contiguously used from block 0 to block 524286 with a 4096 byte block size, block 524286 did not end up in the sparse image and was thus restored as zeros when unsparsing.

Additionally, if the last block of the image is used, this block also ended up being 0:

$> dd if=/dev/zero of=test.ext4 bs=4096 count=10240 $> mkfs.ext4 test.ext4 $> mkdir test $> sudo mount -t ext4 -o loop test.ext4 test $> sudo dd if=/dev/urandom of=test/contents $> sudo umount test $> ext2simg test.ext4 test.ext4.simg $> simg2img test.ext4.simg test.ext4.restored $> vimdiff <(debugfs -R 'bd 10239' test.ext4) <(debugfs -R 'bd 10239' test.ext4.restored)

This seems to have happened because it was not clear that add_chunk() treats the given end block as exclusive, since the different invocations of add_chunk() seem to make different assumptions on whether the end block is included in the sparse image or not. Add documentation to both the add_chunk function as well as the invocations to clarify this.

This may or may not be the same issue that was reported a few years ago in https://www.spinics.net/lists/linux-ext4/msg58483.html.

Signed-off-by: Clemens Lang clemens.lang@xxxxxx

ebiggers commented 1 year ago

This has been fixed in AOSP by https://r.android.com/2504358.