diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-07-21 09:41:47 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-07-21 10:01:39 +0200 |
commit | c2aac9df8b5b29780bfc4a32fd38facf6a9b84a6 (patch) | |
tree | cabaaa00d5c96da4a897dc814d1880c1c20e8ace /doc | |
parent | ca476afbebda985e777ebf5009c980aee923b4da (diff) |
Fix libsquashfs directory writer size accounting
The squashfs readdir() implementation in the Linux kernel returns
non-existing "." and ".." entries for offsets 0 and 1, and after
that reads from disk. For convenience, it was decided to store an
off-by-3 value on disk instead of doing complex primary school math
to adjust for this. This didn't show up until now, because the kernel
implementation trusts the value from the directory header more than
the actual size in the inode and happily reads 3 more than the inode
would allow it to. This only showed up with 7-zip which subtracts 3
from the size and expects the result to be exact and bails if the
directory headers suggest otherwise.
And yes, I did consider making a "Holy Hand Granade of Antioch"
reference, but consciously decided not to.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/format.txt | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/doc/format.txt b/doc/format.txt index ca444f2..a783c07 100644 --- a/doc/format.txt +++ b/doc/format.txt @@ -664,6 +664,11 @@ +------+--------------+------------------------------------------------------+ | u16 | file size | Total (uncompressed) size in bytes of the entry | | | | listing in the directory table, including headers. | + | | | | + | | | This value is 3 bytes larger than the real listing. | + | | | The Linux kernel creates "." and ".." entries for | + | | | offsets 0 and 1, and only after 3 looks into the | + | | | listing, subtracting 3 from the size. | +------+--------------+------------------------------------------------------+ | u16 | block offset | The (uncompressed) offset within the metadata block | | | | in the directory table where the directory listing | @@ -679,8 +684,8 @@ directory. I.e. a directory with N entries has at least N + 2 link count. - If the "file size" is set to 0, the directory is empty and there is no - corresponding listing in the directory table. + If the "file size" is set to a value < 4, the directory is empty and there is + no corresponding listing in the directory table. An extended directory can have a listing that is at most 4GiB in size, may |