Re: [PATCH] Tolerate zlib deflation with window size < 32Kb
roberto.tyley@gmail.com writes:
Show 29 quoted lines
> + * We must determine if the buffer contains the standard
> + * zlib-deflated stream or the experimental format based
> + * on the in-pack object format. Compare the header byte
> + * for each format:
> + *
> + * RFC1950 zlib w/ deflate : 0www1000 : 0 <= www <= 7
> + * Experimental pack-based : Stttssss : ttt = 1,2,3,4
> + *
> + * If bit 7 is clear and bits 0-3 equal 8, the buffer MUST be
> + * in standard loose-object format, UNLESS it is a Git-pack
> + * format object *exactly* 8 bytes in size when inflated.
> + *
> + * However, RFC1950 also specifies that the 1st 16-bit word
> + * must be divisible by 31 - this checksum tells us our buffer
> + * is in the standard format, giving a false positive only if
> + * the 1st word of the Git-pack format object happens to be
> + * divisible by 31, ie:
> + * ((byte0 * 256) + byte1) % 31 = 0
> + * => 0ttt10000www1000 % 31 = 0
> + *
> + * As it happens, this case can only arise for www=3 & ttt=1
> + * - ie, a Commit object, which would have to be 8 bytes in
> + * size. As no Commit can be that small, we find that the
> + * combination of these two criteria (bitmask & checksum)
> + * can always correctly determine the buffer format.
> */
> word = (map[0] << 8) + map[1];
> - if (map[0] == 0x78 && !(word % 31))
> + if ((map[0] & 0x88) == 0x08 && !(word % 31))
Are you sure about this 0x88? Isn't it 0x8F or something?
> return 0;
> else
> return 1;