Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
git-mirror
/
git
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
0
Pull requests
0
Actions
Projects
0
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Security
Insights
Files
9a6f128
Documentation
block-sha1
builtin
compat
contrib
ewah
git-gui
gitk-git
gitweb
mergetools
perl
po
ppc
t
templates
vcs-svn
xdiff
.gitattributes
.gitignore
.mailmap
COPYING
GIT-VERSION-GEN
INSTALL
LGPL-2.1
Makefile
README
RelNotes
abspath.c
aclocal.m4
advice.c
advice.h
alias.c
alloc.c
archive-tar.c
archive-zip.c
archive.c
archive.h
argv-array.c
argv-array.h
attr.c
attr.h
base85.c
bisect.c
bisect.h
blob.c
blob.h
branch.c
branch.h
builtin.h
bulk-checkin.c
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c
cache-tree.h
cache.h
check-builtins.sh
check-racy.c
check_bindir
color.c
color.h
column.c
column.h
combine-diff.c
command-list.txt
commit-slab.h
commit.c
commit.h
config.c
config.mak.in
config.mak.uname
configure.ac
connect.c
connect.h
connected.c
connected.h
convert.c
convert.h
copy.c
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c
decorate.c
decorate.h
delta.h
diff-delta.c
diff-lib.c
diff-no-index.c
diff.c
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore.h
dir.c
dir.h
editor.c
entry.c
environment.c
exec_cmd.c
exec_cmd.h
fast-import.c
fetch-pack.c
fetch-pack.h
fmt-merge-msg.h
fsck.c
fsck.h
generate-cmdlist.sh
gettext.c
gettext.h
git-add--interactive.perl
git-am.sh
git-archimport.perl
git-bisect.sh
git-compat-util.h
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-difftool.perl
git-filter-branch.sh
git-instaweb.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py
git-parse-remote.sh
git-pull.sh
git-quiltimport.sh
git-rebase--am.sh
git-rebase--interactive.sh
git-rebase--merge.sh
git-rebase.sh
git-relink.perl
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl
git-sh-i18n.sh
git-sh-setup.sh
git-stash.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git.c
git.rc
git.spec.in
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hashmap.c
hashmap.h
help.c
help.h
hex.c
http-backend.c
http-fetch.c
http-push.c
http-walker.c
http.c
http.h
ident.c
imap-send.c
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c
line-log.h
line-range.c
line-range.h
list-objects.c
list-objects.h
ll-merge.c
ll-merge.h
lockfile.c
log-tree.c
log-tree.h
mailmap.c
mailmap.h
match-trees.c
merge-blobs.c
merge-blobs.h
merge-recursive.c
merge-recursive.h
merge.c
mergesort.c
mergesort.h
name-hash.c
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c
notes-utils.h
notes.c
notes.h
object.c
object.h
pack-bitmap-write.c
pack-bitmap.c
pack-bitmap.h
pack-check.c
pack-objects.c
pack-objects.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
pager.c
parse-options-cb.c
parse-options.c
parse-options.h
patch-delta.c
patch-ids.c
patch-ids.h
path.c
pathspec.c
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
pretty.c
prio-queue.c
prio-queue.h
progress.c
progress.h
prompt.c
prompt.h
quote.c
quote.h
reachable.c
reachable.h
read-cache.c
reflog-walk.c
reflog-walk.h
refs.c
refs.h
remote-curl.c
remote-testsvn.c
remote.c
remote.h
replace_object.c
rerere.c
rerere.h
resolve-undo.c
resolve-undo.h
revision.c
revision.h
run-command.c
run-command.h
send-pack.c
send-pack.h
sequencer.c
sequencer.h
server-info.c
setup.c
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1-lookup.c
sha1-lookup.h
sha1_file.c
sha1_name.c
shallow.c
shell.c
shortlog.h
show-index.c
sideband.c
sideband.h
sigchain.c
sigchain.h
strbuf.c
strbuf.h
streaming.c
streaming.h
string-list.c
string-list.h
submodule.c
submodule.h
symlinks.c
tag.c
tag.h
tar.h
test-chmtime.c
test-ctype.c
test-date.c
test-delta.c
test-dump-cache-tree.c
test-genrandom.c
test-hashmap.c
test-index-version.c
test-line-buffer.c
test-match-trees.c
test-mergesort.c
test-mktemp.c
test-parse-options.c
test-path-utils.c
test-prio-queue.c
test-read-cache.c
test-regex.c
test-revision-walking.c
test-run-command.c
test-scrap-cache-tree.c
test-sha1.c
test-sha1.sh
test-sigchain.c
test-string-list.c
test-subprocess.c
test-svn-fe.c
test-urlmatch-normalization.c
test-wildmatch.c
thread-utils.c
thread-utils.h
trace.c
transport-helper.c
transport.c
transport.h
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c
unpack-trees.h
upload-pack.c
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c
userdiff.h
utf8.c
utf8.h
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c
walker.h
wildmatch.c
wildmatch.h
wrap-for-bin.sh
wrapper.c
write_or_die.c
ws.c
wt-status.c
wt-status.h
xdiff-interface.c
xdiff-interface.h
zlib.c
Breadcrumbs
git
/
zlib.c
Blame
Blame
Latest commit
History
History
273 lines (238 loc) · 6.13 KB
Breadcrumbs
git
/
zlib.c
Top
File metadata and controls
Code
Blame
273 lines (238 loc) · 6.13 KB
Raw
/* * zlib wrappers to make sure we don't silently miss errors * at init time. */ #include "cache.h" static const char *zerr_to_string(int status) { switch (status) { case Z_MEM_ERROR: return "out of memory"; case Z_VERSION_ERROR: return "wrong version"; case Z_NEED_DICT: return "needs dictionary"; case Z_DATA_ERROR: return "data stream error"; case Z_STREAM_ERROR: return "stream consistency error"; default: return "unknown error"; } } /* * 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) */ #define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */ static inline uInt zlib_buf_cap(unsigned long len) { return (ZLIB_BUF_MAX < len) ? ZLIB_BUF_MAX : 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) { unsigned long bytes_consumed; unsigned long bytes_produced; bytes_consumed = s->z.next_in - s->next_in; bytes_produced = s->z.next_out - s->next_out; if (s->z.total_out != s->total_out + bytes_produced) die("BUG: total_out mismatch"); if (s->z.total_in != s->total_in + bytes_consumed) die("BUG: total_in mismatch"); s->total_out = s->z.total_out; s->total_in = s->z.total_in; s->next_in = s->z.next_in; s->next_out = s->z.next_out; s->avail_in -= bytes_consumed; s->avail_out -= bytes_produced; } void git_inflate_init(git_zstream *strm) { int status; zlib_pre_call(strm); status = inflateInit(&strm->z); zlib_post_call(strm); if (status == Z_OK) return; die("inflateInit: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } void git_inflate_init_gzip_only(git_zstream *strm) { /* * Use default 15 bits, +16 is to accept only gzip and to * yield Z_DATA_ERROR when fed zlib format. */ const int windowBits = 15 + 16; int status; zlib_pre_call(strm); status = inflateInit2(&strm->z, windowBits); zlib_post_call(strm); if (status == Z_OK) return; die("inflateInit2: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } void git_inflate_end(git_zstream *strm) { int status; zlib_pre_call(strm); status = inflateEnd(&strm->z); zlib_post_call(strm); if (status == Z_OK) return; error("inflateEnd: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } int git_inflate(git_zstream *strm, int flush) { int status; for (;;) { zlib_pre_call(strm); /* Never say Z_FINISH unless we are feeding everything */ status = inflate(&strm->z, (strm->z.avail_in != strm->avail_in) ? 0 : flush); if (status == Z_MEM_ERROR) die("inflate: out of memory"); zlib_post_call(strm); /* * Let zlib work another round, while we can still * make progress. */ if ((strm->avail_out && !strm->z.avail_out) && (status == Z_OK || status == Z_BUF_ERROR)) continue; break; } switch (status) { /* Z_BUF_ERROR: normal, needs more space in the output buffer */ case Z_BUF_ERROR: case Z_OK: case Z_STREAM_END: return status; default: break; } error("inflate: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); return status; } #if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200 #define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11) #endif unsigned long git_deflate_bound(git_zstream *strm, unsigned long size) { return deflateBound(&strm->z, size); } void git_deflate_init(git_zstream *strm, int level) { int status; memset(strm, 0, sizeof(*strm)); zlib_pre_call(strm); status = deflateInit(&strm->z, level); zlib_post_call(strm); if (status == Z_OK) return; die("deflateInit: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } static void do_git_deflate_init(git_zstream *strm, int level, int windowBits) { int status; memset(strm, 0, sizeof(*strm)); zlib_pre_call(strm); status = deflateInit2(&strm->z, level, Z_DEFLATED, windowBits, 8, Z_DEFAULT_STRATEGY); zlib_post_call(strm); if (status == Z_OK) return; die("deflateInit2: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } void git_deflate_init_gzip(git_zstream *strm, int level) { /* * Use default 15 bits, +16 is to generate gzip header/trailer * instead of the zlib wrapper. */ do_git_deflate_init(strm, level, 15 + 16); } void git_deflate_init_raw(git_zstream *strm, int level) { /* * Use default 15 bits, negate the value to get raw compressed * data without zlib header and trailer. */ do_git_deflate_init(strm, level, -15); } int git_deflate_abort(git_zstream *strm) { int status; zlib_pre_call(strm); status = deflateEnd(&strm->z); zlib_post_call(strm); return status; } void git_deflate_end(git_zstream *strm) { int status = git_deflate_abort(strm); if (status == Z_OK) return; error("deflateEnd: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); } int git_deflate_end_gently(git_zstream *strm) { int status; zlib_pre_call(strm); status = deflateEnd(&strm->z); zlib_post_call(strm); return status; } int git_deflate(git_zstream *strm, int flush) { int status; for (;;) { zlib_pre_call(strm); /* Never say Z_FINISH unless we are feeding everything */ status = deflate(&strm->z, (strm->z.avail_in != strm->avail_in) ? 0 : flush); if (status == Z_MEM_ERROR) die("deflate: out of memory"); zlib_post_call(strm); /* * Let zlib work another round, while we can still * make progress. */ if ((strm->avail_out && !strm->z.avail_out) && (status == Z_OK || status == Z_BUF_ERROR)) continue; break; } switch (status) { /* Z_BUF_ERROR: normal, needs more space in the output buffer */ case Z_BUF_ERROR: case Z_OK: case Z_STREAM_END: return status; default: break; } error("deflate: %s (%s)", zerr_to_string(status), strm->z.msg ? strm->z.msg : "no message"); return status; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
You can’t perform that action at this time.