+/*
+ * avail_in and avail_out in zlib are counted in uInt, which typically
+ * limits the size of the buffer we can use to 4GB when interacting
+ * with zlib in a single call to inflate/deflate.
+ */
+#define ZLIB_BUF_MAX ((uInt)-1)
+static inline uInt zlib_buf_cap(unsigned long len)
+{
+ if (ZLIB_BUF_MAX < len)
+ die("working buffer for zlib too large");
+ return len;
+}
+
+static void zlib_pre_call(git_zstream *s)
+{
+ s->z.next_in = s->next_in;
+ s->z.next_out = s->next_out;
+ s->z.total_in = s->total_in;
+ s->z.total_out = s->total_out;
+ s->z.avail_in = zlib_buf_cap(s->avail_in);
+ s->z.avail_out = zlib_buf_cap(s->avail_out);
+}
+
+static void zlib_post_call(git_zstream *s)
+{
+ s->next_in = s->z.next_in;
+ s->next_out = s->z.next_out;
+ s->total_in = s->z.total_in;
+ s->total_out = s->z.total_out;
+ s->avail_in = s->z.avail_in;
+ s->avail_out = s->z.avail_out;
+}
+
+void git_inflate_init(git_zstream *strm)