Revision 0b6806b9e45c659d25b87fb5713c920a3081eac8 authored by Steffen Prohaska on 20 August 2013, 06:43:54 UTC, committed by Junio C Hamano on 20 August 2013, 18:10:59 UTC
Checking out 2GB or more through an external filter (see test) fails
on Mac OS X 10.8.4 (12E55) for a 64-bit executable with:

    error: read from external filter cat failed
    error: cannot feed the input to external filter cat
    error: cat died of signal 13
    error: external filter cat failed 141
    error: external filter cat failed

The reason is that read() immediately returns with EINVAL when asked
to read more than 2GB.  According to POSIX [1], if the value of
nbyte passed to read() is greater than SSIZE_MAX, the result is
implementation-defined.  The write function has the same restriction
[2].  Since OS X still supports running 32-bit executables, the
32-bit limit (SSIZE_MAX = INT_MAX = 2GB - 1) seems to be also
imposed on 64-bit executables under certain conditions.  For write,
the problem has been addressed earlier [6c642a].

Address the problem for read() and write() differently, by limiting
size of IO chunks unconditionally on all platforms in xread() and
xwrite().  Large chunks only cause problems, like causing latencies
when killing the process, even if OS X was not buggy.  Doing IO in
reasonably sized smaller chunks should have no negative impact on
performance.

The compat wrapper clipped_write() introduced earlier [6c642a] is
not needed anymore.  It will be reverted in a separate commit.  The
new test catches read and write problems.

Note that 'git add' exits with 0 even if it prints filtering errors
to stderr.  The test, therefore, checks stderr.  'git add' should
probably be changed (sometime in another commit) to exit with
nonzero if filtering fails.  The test could then be changed to use
test_must_fail.

Thanks to the following people for suggestions and testing:

    Johannes Sixt <j6t@kdbg.org>
    John Keeping <john@keeping.me.uk>
    Jonathan Nieder <jrnieder@gmail.com>
    Kyle J. McKay <mackyle@gmail.com>
    Linus Torvalds <torvalds@linux-foundation.org>
    Torsten Bögershausen <tboegi@web.de>

[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html
[2] http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html

[6c642a] commit 6c642a878688adf46b226903858b53e2d31ac5c3
    compate/clipped-write.c: large write(2) fails on Mac OS X/XNU

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 4d06473
History
File Mode Size
Documentation
block-sha1
builtin
compat
contrib
git-gui
git_remote_helpers
gitk-git
gitweb
mergetools
perl
po
ppc
t
templates
vcs-svn
xdiff
.gitattributes -rw-r--r-- 105 bytes
.gitignore -rw-r--r-- 3.5 KB
.mailmap -rw-r--r-- 13.4 KB
COPYING -rw-r--r-- 18.3 KB
GIT-VERSION-GEN -rwxr-xr-x 768 bytes
INSTALL -rw-r--r-- 8.5 KB
LGPL-2.1 -rw-r--r-- 26.2 KB
Makefile -rw-r--r-- 75.0 KB
README -rw-r--r-- 2.6 KB
RelNotes l--------- 32 bytes
abspath.c -rw-r--r-- 5.7 KB
aclocal.m4 -rw-r--r-- 1.4 KB
advice.c -rw-r--r-- 3.3 KB
advice.h -rw-r--r-- 966 bytes
alias.c -rw-r--r-- 1.7 KB
alloc.c -rw-r--r-- 1.6 KB
archive-tar.c -rw-r--r-- 11.0 KB
archive-zip.c -rw-r--r-- 12.1 KB
archive.c -rw-r--r-- 11.9 KB
archive.h -rw-r--r-- 1.3 KB
argv-array.c -rw-r--r-- 1.8 KB
argv-array.h -rw-r--r-- 696 bytes
attr.c -rw-r--r-- 19.2 KB
attr.h -rw-r--r-- 1.6 KB
base85.c -rw-r--r-- 2.8 KB
bisect.c -rw-r--r-- 23.6 KB
bisect.h -rw-r--r-- 644 bytes
blob.c -rw-r--r-- 565 bytes
blob.h -rw-r--r-- 664 bytes
branch.c -rw-r--r-- 8.4 KB
branch.h -rw-r--r-- 1.9 KB
builtin.h -rw-r--r-- 8.5 KB
bulk-checkin.c -rw-r--r-- 7.0 KB
bulk-checkin.h -rw-r--r-- 343 bytes
bundle.c -rw-r--r-- 11.1 KB
bundle.h -rw-r--r-- 707 bytes
cache-tree.c -rw-r--r-- 16.6 KB
cache-tree.h -rw-r--r-- 1.5 KB
cache.h -rw-r--r-- 48.7 KB
check-builtins.sh -rwxr-xr-x 588 bytes
check-racy.c -rw-r--r-- 538 bytes
check_bindir -rwxr-xr-x 369 bytes
color.c -rw-r--r-- 5.2 KB
color.h -rw-r--r-- 3.1 KB
column.c -rw-r--r-- 10.2 KB
column.h -rw-r--r-- 1.4 KB
combine-diff.c -rw-r--r-- 36.2 KB
command-list.txt -rw-r--r-- 8.2 KB
commit-slab.h -rw-r--r-- 2.9 KB
commit.c -rw-r--r-- 37.5 KB
commit.h -rw-r--r-- 8.9 KB
config.c -rw-r--r-- 41.9 KB
config.mak.in -rw-r--r-- 540 bytes
config.mak.uname -rw-r--r-- 15.2 KB
configure.ac -rw-r--r-- 32.1 KB
connect.c -rw-r--r-- 14.9 KB
connected.c -rw-r--r-- 2.6 KB
connected.h -rw-r--r-- 818 bytes
convert.c -rw-r--r-- 29.2 KB
convert.h -rw-r--r-- 2.2 KB
copy.c -rw-r--r-- 1.6 KB
credential-cache--daemon.c -rw-r--r-- 5.9 KB
credential-cache.c -rw-r--r-- 2.9 KB
credential-store.c -rw-r--r-- 4.0 KB
credential.c -rw-r--r-- 7.6 KB
credential.h -rw-r--r-- 822 bytes
csum-file.c -rw-r--r-- 4.0 KB
csum-file.h -rw-r--r-- 1.1 KB
ctype.c -rw-r--r-- 2.6 KB
daemon.c -rw-r--r-- 30.5 KB
date.c -rw-r--r-- 25.0 KB
decorate.c -rw-r--r-- 1.8 KB
decorate.h -rw-r--r-- 400 bytes
delta.h -rw-r--r-- 3.4 KB
diff-delta.c -rw-r--r-- 15.5 KB
diff-lib.c -rw-r--r-- 14.1 KB
diff-no-index.c -rw-r--r-- 6.3 KB
diff.c -rw-r--r-- 132.3 KB
diff.h -rw-r--r-- 11.1 KB
diffcore-break.c -rw-r--r-- 8.8 KB
diffcore-delta.c -rw-r--r-- 5.4 KB
diffcore-order.c -rw-r--r-- 2.2 KB
diffcore-pickaxe.c -rw-r--r-- 6.4 KB
diffcore-rename.c -rw-r--r-- 18.6 KB
diffcore.h -rw-r--r-- 4.4 KB
dir.c -rw-r--r-- 39.9 KB
dir.h -rw-r--r-- 6.4 KB
editor.c -rw-r--r-- 1.5 KB
entry.c -rw-r--r-- 6.9 KB
environment.c -rw-r--r-- 7.5 KB
exec_cmd.c -rw-r--r-- 3.2 KB
exec_cmd.h -rw-r--r-- 509 bytes
fast-import.c -rw-r--r-- 87.4 KB
fetch-pack.c -rw-r--r-- 24.3 KB
fetch-pack.h -rw-r--r-- 808 bytes
fmt-merge-msg.h -rw-r--r-- 187 bytes
fsck.c -rw-r--r-- 10.1 KB
fsck.h -rw-r--r-- 1.0 KB
generate-cmdlist.sh -rwxr-xr-x 433 bytes
gettext.c -rw-r--r-- 4.1 KB
gettext.h -rw-r--r-- 1.4 KB
git-add--interactive.perl -rwxr-xr-x 35.9 KB
git-am.sh -rwxr-xr-x 22.5 KB
git-archimport.perl -rwxr-xr-x 36.0 KB
git-bisect.sh -rwxr-xr-x 11.7 KB
git-compat-util.h -rw-r--r-- 17.9 KB
git-cvsexportcommit.perl -rwxr-xr-x 12.6 KB
git-cvsimport.perl -rwxr-xr-x 31.3 KB
git-cvsserver.perl -rwxr-xr-x 158.5 KB
git-difftool--helper.sh -rwxr-xr-x 1.9 KB
git-difftool.perl -rwxr-xr-x 13.3 KB
git-filter-branch.sh -rwxr-xr-x 11.3 KB
git-instaweb.sh -rwxr-xr-x 17.8 KB
git-lost-found.sh -rwxr-xr-x 554 bytes
git-merge-octopus.sh -rwxr-xr-x 2.2 KB
git-merge-one-file.sh -rwxr-xr-x 3.4 KB
git-merge-resolve.sh -rwxr-xr-x 944 bytes
git-mergetool--lib.sh -rw-r--r-- 7.4 KB
git-mergetool.sh -rwxr-xr-x 8.2 KB
git-p4.py -rwxr-xr-x 123.2 KB
git-parse-remote.sh -rw-r--r-- 2.1 KB
git-pull.sh -rwxr-xr-x 8.0 KB
git-quiltimport.sh -rwxr-xr-x 3.3 KB
git-rebase--am.sh -rw-r--r-- 1.4 KB
git-rebase--interactive.sh -rw-r--r-- 25.9 KB
git-rebase--merge.sh -rw-r--r-- 3.0 KB
git-rebase.sh -rwxr-xr-x 14.5 KB
git-relink.perl -rwxr-xr-x 4.0 KB
git-remote-testgit.sh -rwxr-xr-x 2.4 KB
git-remote-testpy.py -rw-r--r-- 7.2 KB
git-repack.sh -rwxr-xr-x 4.9 KB
git-request-pull.sh -rwxr-xr-x 3.7 KB
git-send-email.perl -rwxr-xr-x 42.8 KB
git-sh-i18n.sh -rw-r--r-- 2.0 KB
git-sh-setup.sh -rw-r--r-- 6.5 KB
git-stash.sh -rwxr-xr-x 13.1 KB
git-submodule.sh -rwxr-xr-x 31.0 KB
git-svn.perl -rwxr-xr-x 59.6 KB
git-web--browse.sh -rwxr-xr-x 4.3 KB
git.c -rw-r--r-- 17.2 KB
git.rc -rw-r--r-- 574 bytes
git.spec.in -rw-r--r-- 11.1 KB
gpg-interface.c -rw-r--r-- 3.7 KB
gpg-interface.h -rw-r--r-- 721 bytes
graph.c -rw-r--r-- 34.8 KB
graph.h -rw-r--r-- 3.9 KB
grep.c -rw-r--r-- 38.7 KB
grep.h -rw-r--r-- 4.7 KB
hash.c -rw-r--r-- 2.5 KB
hash.h -rw-r--r-- 1.4 KB
help.c -rw-r--r-- 11.1 KB
help.h -rw-r--r-- 1.1 KB
hex.c -rw-r--r-- 2.3 KB
http-backend.c -rw-r--r-- 13.8 KB
http-fetch.c -rw-r--r-- 2.3 KB
http-push.c -rw-r--r-- 50.5 KB
http-walker.c -rw-r--r-- 14.0 KB
http.c -rw-r--r-- 34.5 KB
http.h -rw-r--r-- 5.3 KB
ident.c -rw-r--r-- 9.3 KB
imap-send.c -rw-r--r-- 33.3 KB
kwset.c -rw-r--r-- 20.5 KB
kwset.h -rw-r--r-- 2.6 KB
levenshtein.c -rw-r--r-- 2.5 KB
levenshtein.h -rw-r--r-- 203 bytes
line-log.c -rw-r--r-- 31.0 KB
line-log.h -rw-r--r-- 1.3 KB
line-range.c -rw-r--r-- 5.4 KB
line-range.h -rw-r--r-- 1.2 KB
list-objects.c -rw-r--r-- 5.5 KB
list-objects.h -rw-r--r-- 429 bytes
ll-merge.c -rw-r--r-- 10.2 KB
ll-merge.h -rw-r--r-- 567 bytes
lockfile.c -rw-r--r-- 6.3 KB
log-tree.c -rw-r--r-- 22.0 KB
log-tree.h -rw-r--r-- 1015 bytes
mailmap.c -rw-r--r-- 8.8 KB
mailmap.h -rw-r--r-- 271 bytes
match-trees.c -rw-r--r-- 8.2 KB
merge-blobs.c -rw-r--r-- 2.6 KB
merge-blobs.h -rw-r--r-- 194 bytes
merge-recursive.c -rw-r--r-- 58.1 KB
merge-recursive.h -rw-r--r-- 1.6 KB
merge.c -rw-r--r-- 2.8 KB
mergesort.c -rw-r--r-- 1.5 KB
mergesort.h -rw-r--r-- 574 bytes
name-hash.c -rw-r--r-- 7.6 KB
notes-cache.c -rw-r--r-- 2.2 KB
notes-cache.h -rw-r--r-- 500 bytes
notes-merge.c -rw-r--r-- 22.6 KB
notes-merge.h -rw-r--r-- 2.9 KB
notes-utils.c -rw-r--r-- 4.4 KB
notes-utils.h -rw-r--r-- 1.1 KB
notes.c -rw-r--r-- 36.1 KB
notes.h -rw-r--r-- 11.2 KB
object.c -rw-r--r-- 8.0 KB
object.h -rw-r--r-- 3.5 KB
pack-check.c -rw-r--r-- 5.0 KB
pack-revindex.c -rw-r--r-- 7.0 KB
pack-revindex.h -rw-r--r-- 223 bytes
pack-write.c -rw-r--r-- 10.4 KB
pack.h -rw-r--r-- 3.2 KB
pager.c -rw-r--r-- 3.5 KB
parse-options-cb.c -rw-r--r-- 2.7 KB
parse-options.c -rw-r--r-- 15.4 KB
parse-options.h -rw-r--r-- 8.9 KB
patch-delta.c -rw-r--r-- 2.2 KB
patch-ids.c -rw-r--r-- 2.5 KB
patch-ids.h -rw-r--r-- 490 bytes
path.c -rw-r--r-- 16.2 KB
pathspec.c -rw-r--r-- 3.0 KB
pathspec.h -rw-r--r-- 372 bytes
pkt-line.c -rw-r--r-- 4.5 KB
pkt-line.h -rw-r--r-- 3.0 KB
preload-index.c -rw-r--r-- 2.4 KB
pretty.c -rw-r--r-- 42.9 KB
prio-queue.c -rw-r--r-- 1.9 KB
prio-queue.h -rw-r--r-- 1.4 KB
progress.c -rw-r--r-- 6.1 KB
progress.h -rw-r--r-- 504 bytes
prompt.c -rw-r--r-- 1.4 KB
prompt.h -rw-r--r-- 207 bytes
quote.c -rw-r--r-- 10.3 KB
quote.h -rw-r--r-- 2.8 KB
reachable.c -rw-r--r-- 6.2 KB
reachable.h -rw-r--r-- 163 bytes
read-cache.c -rw-r--r-- 52.8 KB
reflog-walk.c -rw-r--r-- 8.3 KB
reflog-walk.h -rw-r--r-- 773 bytes
refs.c -rw-r--r-- 89.2 KB
refs.h -rw-r--r-- 8.2 KB
remote-curl.c -rw-r--r-- 22.0 KB
remote-testsvn.c -rw-r--r-- 8.5 KB
remote.c -rw-r--r-- 47.3 KB
remote.h -rw-r--r-- 4.5 KB
replace_object.c -rw-r--r-- 2.7 KB
rerere.c -rw-r--r-- 18.0 KB
rerere.h -rw-r--r-- 778 bytes
resolve-undo.c -rw-r--r-- 4.3 KB
resolve-undo.h -rw-r--r-- 602 bytes
revision.c -rw-r--r-- 83.4 KB
revision.h -rw-r--r-- 6.6 KB
run-command.c -rw-r--r-- 16.7 KB
run-command.h -rw-r--r-- 2.9 KB
send-pack.c -rw-r--r-- 7.6 KB
send-pack.h -rw-r--r-- 403 bytes
sequencer.c -rw-r--r-- 32.2 KB
sequencer.h -rw-r--r-- 1020 bytes
server-info.c -rw-r--r-- 5.1 KB
setup.c -rw-r--r-- 24.2 KB
sh-i18n--envsubst.c -rw-r--r-- 10.7 KB
sha1-array.c -rw-r--r-- 1.2 KB
sha1-array.h -rw-r--r-- 583 bytes
sha1-lookup.c -rw-r--r-- 7.8 KB
sha1-lookup.h -rw-r--r-- 403 bytes
sha1_file.c -rw-r--r-- 78.3 KB
sha1_name.c -rw-r--r-- 34.6 KB
shallow.c -rw-r--r-- 3.4 KB
shell.c -rw-r--r-- 5.2 KB
shortlog.h -rw-r--r-- 463 bytes
show-index.c -rw-r--r-- 2.2 KB
sideband.c -rw-r--r-- 3.4 KB
sideband.h -rw-r--r-- 262 bytes
sigchain.c -rw-r--r-- 969 bytes
sigchain.h -rw-r--r-- 215 bytes
strbuf.c -rw-r--r-- 11.6 KB
strbuf.h -rw-r--r-- 6.1 KB
streaming.c -rw-r--r-- 11.7 KB
streaming.h -rw-r--r-- 504 bytes
string-list.c -rw-r--r-- 7.4 KB
string-list.h -rw-r--r-- 4.9 KB
submodule.c -rw-r--r-- 27.8 KB
submodule.h -rw-r--r-- 1.6 KB
symlinks.c -rw-r--r-- 9.4 KB
tag.c -rw-r--r-- 3.9 KB
tag.h -rw-r--r-- 576 bytes
tar.h -rw-r--r-- 644 bytes
test-chmtime.c -rw-r--r-- 2.6 KB
test-ctype.c -rw-r--r-- 918 bytes
test-date.c -rw-r--r-- 1.4 KB
test-delta.c -rw-r--r-- 1.8 KB
test-dump-cache-tree.c -rw-r--r-- 1.5 KB
test-genrandom.c -rw-r--r-- 722 bytes
test-index-version.c -rw-r--r-- 258 bytes
test-line-buffer.c -rw-r--r-- 2.1 KB
test-match-trees.c -rw-r--r-- 588 bytes
test-mergesort.c -rw-r--r-- 924 bytes
test-mktemp.c -rw-r--r-- 269 bytes
test-parse-options.c -rw-r--r-- 3.5 KB
test-path-utils.c -rw-r--r-- 3.5 KB
test-prio-queue.c -rw-r--r-- 621 bytes
test-read-cache.c -rw-r--r-- 202 bytes
test-regex.c -rw-r--r-- 534 bytes
test-revision-walking.c -rw-r--r-- 1.4 KB
test-run-command.c -rw-r--r-- 840 bytes
test-scrap-cache-tree.c -rw-r--r-- 395 bytes
test-sha1.c -rw-r--r-- 816 bytes
test-sha1.sh -rwxr-xr-x 1.9 KB
test-sigchain.c -rw-r--r-- 344 bytes
test-string-list.c -rw-r--r-- 2.5 KB
test-subprocess.c -rw-r--r-- 401 bytes
test-svn-fe.c -rw-r--r-- 1.3 KB
test-wildmatch.c -rw-r--r-- 2.7 KB
thread-utils.c -rw-r--r-- 1.3 KB
thread-utils.h -rw-r--r-- 209 bytes
trace.c -rw-r--r-- 4.7 KB
transport-helper.c -rw-r--r-- 32.1 KB
transport.c -rw-r--r-- 34.2 KB
transport.h -rw-r--r-- 6.5 KB
tree-diff.c -rw-r--r-- 8.6 KB
tree-walk.c -rw-r--r-- 17.7 KB
tree-walk.h -rw-r--r-- 2.2 KB
tree.c -rw-r--r-- 6.2 KB
tree.h -rw-r--r-- 897 bytes
unimplemented.sh -rw-r--r-- 100 bytes
unix-socket.c -rw-r--r-- 2.4 KB
unix-socket.h -rw-r--r-- 158 bytes
unpack-trees.c -rw-r--r-- 47.9 KB
unpack-trees.h -rw-r--r-- 2.2 KB
upload-pack.c -rw-r--r-- 20.0 KB
url.c -rw-r--r-- 2.8 KB
url.h -rw-r--r-- 492 bytes
usage.c -rw-r--r-- 3.3 KB
userdiff.c -rw-r--r-- 9.2 KB
userdiff.h -rw-r--r-- 646 bytes
utf8.c -rw-r--r-- 16.4 KB
utf8.h -rw-r--r-- 1.4 KB
varint.c -rw-r--r-- 631 bytes
varint.h -rw-r--r-- 198 bytes
version.c -rw-r--r-- 651 bytes
version.h -rw-r--r-- 180 bytes
walker.c -rw-r--r-- 7.2 KB
walker.h -rw-r--r-- 1.1 KB
wildmatch.c -rw-r--r-- 7.8 KB
wildmatch.h -rw-r--r-- 346 bytes
wrap-for-bin.sh -rw-r--r-- 707 bytes
wrapper.c -rw-r--r-- 9.7 KB
write_or_die.c -rw-r--r-- 1.9 KB
ws.c -rw-r--r-- 9.6 KB
wt-status.c -rw-r--r-- 39.7 KB
wt-status.h -rw-r--r-- 2.5 KB
xdiff-interface.c -rw-r--r-- 7.0 KB
xdiff-interface.h -rw-r--r-- 944 bytes
zlib.c -rw-r--r-- 6.1 KB

README

back to top