mirror of
https://github.com/git-for-windows/git.git
synced 2026-06-09 23:48:23 -05:00
On Windows, zlib's `uLong` type is 32-bit even on 64-bit systems. When processing data streams larger than 4GB, the `total_in` and `total_out` fields in zlib's `z_stream` structure wrap around, which caused the sanity checks in `zlib_post_call()` to trigger `BUG()` assertions. The git_zstream wrapper now tracks its own 64-bit totals rather than copying them from zlib. The sanity checks compare only the low bits, using `maximum_unsigned_value_of_type(uLong)` to mask appropriately for the platform's `uLong` size. This is based on work by LordKiRon in git-for-windows#6076. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
31 lines
850 B
C
31 lines
850 B
C
#ifndef GIT_ZLIB_H
|
|
#define GIT_ZLIB_H
|
|
|
|
#include "compat/zlib-compat.h"
|
|
|
|
typedef struct git_zstream {
|
|
struct z_stream_s z;
|
|
unsigned long avail_in;
|
|
unsigned long avail_out;
|
|
size_t total_in;
|
|
size_t total_out;
|
|
unsigned char *next_in;
|
|
unsigned char *next_out;
|
|
} git_zstream;
|
|
|
|
void git_inflate_init(git_zstream *);
|
|
void git_inflate_init_gzip_only(git_zstream *);
|
|
void git_inflate_end(git_zstream *);
|
|
int git_inflate(git_zstream *, int flush);
|
|
|
|
void git_deflate_init(git_zstream *, int level);
|
|
void git_deflate_init_gzip(git_zstream *, int level);
|
|
void git_deflate_init_raw(git_zstream *, int level);
|
|
void git_deflate_end(git_zstream *);
|
|
int git_deflate_abort(git_zstream *);
|
|
int git_deflate_end_gently(git_zstream *);
|
|
int git_deflate(git_zstream *, int flush);
|
|
unsigned long git_deflate_bound(git_zstream *, unsigned long);
|
|
|
|
#endif /* GIT_ZLIB_H */
|