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

Reply via email to