libgit2 currently identifies loose objects as corrupt if they've been deflated using a window size less than 32Kb, because the is_zlib_compressed_data() 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=c0b2feff196e63a7b85d97cf9ae5bb258 Code snippet searching for false positives with the zlib checksum: https://gist.github.com/1118177 Change-Id: Ifd84cd2bd6b46f087c9984fb4cbd8309f483dec0
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| ppc | Loading commit data... | |
| transports | Loading commit data... | |
| unix | Loading commit data... | |
| win32 | Loading commit data... | |
| blob.c | Loading commit data... | |
| blob.h | Loading commit data... | |
| bswap.h | Loading commit data... | |
| buffer.c | Loading commit data... | |
| buffer.h | Loading commit data... | |
| cache.c | Loading commit data... | |
| cache.h | Loading commit data... | |
| cc-compat.h | Loading commit data... | |
| commit.c | Loading commit data... | |
| commit.h | Loading commit data... | |
| common.h | Loading commit data... | |
| config.c | Loading commit data... | |
| config.h | Loading commit data... | |
| config_file.c | Loading commit data... | |
| delta-apply.c | Loading commit data... | |
| delta-apply.h | Loading commit data... | |
| dir.h | Loading commit data... | |
| errors.c | Loading commit data... | |
| fetch.c | Loading commit data... | |
| fetch.h | Loading commit data... | |
| filebuf.c | Loading commit data... | |
| filebuf.h | Loading commit data... | |
| fileops.c | Loading commit data... | |
| fileops.h | Loading commit data... | |
| hash.c | Loading commit data... | |
| hash.h | Loading commit data... | |
| hashtable.c | Loading commit data... | |
| hashtable.h | Loading commit data... | |
| index.c | Loading commit data... | |
| index.h | Loading commit data... | |
| indexer.c | Loading commit data... | |
| map.h | Loading commit data... | |
| mwindow.c | Loading commit data... | |
| mwindow.h | Loading commit data... | |
| netops.c | Loading commit data... | |
| netops.h | Loading commit data... | |
| object.c | Loading commit data... | |
| odb.c | Loading commit data... | |
| odb.h | Loading commit data... | |
| odb_loose.c | Loading commit data... | |
| odb_pack.c | Loading commit data... | |
| oid.c | Loading commit data... | |
| pack.c | Loading commit data... | |
| pack.h | Loading commit data... | |
| path.c | Loading commit data... | |
| path.h | Loading commit data... | |
| pkt.c | Loading commit data... | |
| pkt.h | Loading commit data... | |
| posix.c | Loading commit data... | |
| posix.h | Loading commit data... | |
| pqueue.c | Loading commit data... | |
| pqueue.h | Loading commit data... | |
| reflog.c | Loading commit data... | |
| reflog.h | Loading commit data... | |
| refs.c | Loading commit data... | |
| refs.h | Loading commit data... | |
| refspec.c | Loading commit data... | |
| refspec.h | Loading commit data... | |
| remote.c | Loading commit data... | |
| remote.h | Loading commit data... | |
| repository.c | Loading commit data... | |
| repository.h | Loading commit data... | |
| revwalk.c | Loading commit data... | |
| sha1.c | Loading commit data... | |
| sha1.h | Loading commit data... | |
| sha1_lookup.c | Loading commit data... | |
| sha1_lookup.h | Loading commit data... | |
| signature.c | Loading commit data... | |
| signature.h | Loading commit data... | |
| status.c | Loading commit data... | |
| tag.c | Loading commit data... | |
| tag.h | Loading commit data... | |
| thread-utils.c | Loading commit data... | |
| thread-utils.h | Loading commit data... | |
| transport.c | Loading commit data... | |
| transport.h | Loading commit data... | |
| tree-cache.c | Loading commit data... | |
| tree-cache.h | Loading commit data... | |
| tree.c | Loading commit data... | |
| tree.h | Loading commit data... | |
| tsort.c | Loading commit data... | |
| util.c | Loading commit data... | |
| util.h | Loading commit data... | |
| vector.c | Loading commit data... | |
| vector.h | Loading commit data... |