Package: fatcat
Version: 1.0.5-1
Severity: normal
Tags: upstream lfs patch
Dear Maintainer,
I tried using the fatcat utility to list directory entries on a disk image with
corrupted root directory entry, which was larger than 4 gigabytes. This failed.
I narrowed the problem down to a simpler recipe: the -@ option shows the
calculated disk offset to read for a given cluster number.
Given a large fat-formatted disk image test.img (10GB in this example), asking
for various disk offsets shows truncation as the cluster number increases.
# Correct
$ fatcat-1.0.5-old/fatcat -@ 250000 test.img
Cluster 250000 address:
2058476544 (000000007ab1dc00)
# Wraparound to negative
$ fatcat-1.0.5-old/fatcat -@ 350000 test.img
Cluster 350000 address:
18446744072292260864 (ffffffffab85dc00)
# Truncated
$ fatcat-1.0.5-old/fatcat -@ 600000 test.img
Cluster 600000 address:
630709248 (000000002597dc00)
After applying the patch below, the expected steadily increasing results are
printed, even after the 32-bit boundary:
$ fatcat-1.0.5/fatcat -@ 250000 test.img
Cluster 250000 address:
2058476544 (000000007ab1dc00)
$ fatcat-1.0.5/fatcat -@ 350000 test.img
Cluster 350000 address:
2877676544 (00000000ab85dc00)
$ fatcat-1.0.5/fatcat -@ 600000 test.img
Cluster 600000 address:
4925676544 (000000012597dc00)
The patch is trivial, just changing a temporary from 'int' to 'unsigned long
long' before returning it from the function (which returns unsigned long long).
--8<------ snip patch
--- fatcat-1.0.5-old/src/core/FatSystem.cpp 2014-08-08 19:55:33.000000000
+0800
+++ fatcat-1.0.5/src/core/FatSystem.cpp 2017-10-27 17:51:26.784312916 +0800
@@ -283,7 +283,7 @@
cluster -= 2;
}
- int addr = (dataStart + bytesPerSector*sectorsPerCluster*cluster);
+ unsigned long long addr = (dataStart +
bytesPerSector*sectorsPerCluster*cluster);
if (type == FAT16 && !isRoot) {
addr += rootEntries * FAT_ENTRY_SIZE;
--8<------ snip patch
I haven't tested the directory listing operations I was initially attempting,
but I see no other obvious problems in the source which would prevent it.
The package doesn't seem too active upstream.
I have checked the github page and it still contains this bug, as does current
Debian testing and also the downstream Ubuntu copy of the package.
Hope it helps,
Harun
-- System Information:
Debian Release: 8.9
APT prefers oldstable-updates
APT policy: (500, 'oldstable-updates'), (500, 'oldstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.16.0-4-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages fatcat depends on:
ii libc6 2.19-18+deb8u10
ii libgcc1 1:4.9.2-10
ii libstdc++6 4.9.2-10
fatcat recommends no packages.
fatcat suggests no packages.
-- no debconf information