diff options
author | Roberto Tyley <roberto.tyley@guardian.co.uk> | 2011-08-25 22:25:10 +0100 |
---|---|---|
committer | Roberto Tyley <roberto.tyley@guardian.co.uk> | 2011-08-25 22:25:10 +0100 |
commit | 602b2f0d450236a7e4d1b5bc1532a092b0a3129f (patch) | |
tree | d3369ea18399ec232d8338b0b3f9b10f4d050ee0 /org.eclipse.jgit.packaging/pom.xml | |
parent | 28a49925245df61f24b072727265a9eb530ab184 (diff) | |
download | jgit-602b2f0d450236a7e4d1b5bc1532a092b0a3129f.tar.gz jgit-602b2f0d450236a7e4d1b5bc1532a092b0a3129f.zip |
Tolerate zlib deflation with window size < 32Kb
JGit currently identifies loose objects as 'corrupt' if they've been
deflated using a window size less than 32Kb, because the
isStandardFormat() function doesn't recognise the header
byte as a zlib header. This patch makes the method tolerant of
all valid window sizes (15-bit to 8-bit) - but doesn't sacrifice
it's accuracy in distingushing the standard loose-object format
from the experimental (now abandoned) format. It's based on a patch
which has been merged into C-Git master branch:
https://github.com/git/git/commit/7f684a2aff636f44a506
On memory constrained systems zlib may use a much smaller window
size - working on Agit, I found that Android uses a 4KB window;
giving a header byte of 0x48, not 0x78. Consequently all loose
objects generated by the Android platform appear 'corrupt' :(
It might appear that this patch changes isStandardFormat() to the
point where it could incorrectly identify the experimental format as
the standard one, but the two criteria (bitmask & checksum) can only
give a false result for an experimental object where both of the
following are true:
1) object size is exactly 8 bytes when uncompressed (bitmask)
2) [single-byte in-pack git type&size header] * 256
+ [1st byte of the following zlib header] % 31 = 0 (checksum)
As it happens, for all possible combinations of valid object type
(1-4) and window bits (0-7), the only time when the checksum will be
divisible by 31 is for 0x1838 - ie object type *1*, a Commit - which,
due the fields all Commit objects must contain, could never be as
small as 8 bytes in size.
Given this, the combination of the two criteria (bitmask & checksum)
always correctly determines the buffer format, and is more tolerant
than the previous version.
References:
Android uses a 4KB window for deflation:
http://android.git.kernel.org/?p=platform/libcore.git;a=blob;f=luni/src/main/native/java_util_zip_Deflater.cpp;h=c0b2feff196e63a7b85d97cf9ae5bb2583409c28;hb=refs/heads/gingerbread#l53
Code snippet searching for false positives with the zlib checksum:
https://gist.github.com/1118177
Change-Id: Ifd84cd2bd6b46f087c9984fb4cbd8309f483dec0
Diffstat (limited to 'org.eclipse.jgit.packaging/pom.xml')
0 files changed, 0 insertions, 0 deletions