1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-11-08 10:13:18 +01:00
Find a file
Johan Herland b2476a60bd sha1_file.c:create_tmpfile(): Fix race when creating loose object dirs
There are cases (e.g. when running concurrent fetches in a repo) where
multiple Git processes concurrently attempt to create loose objects
within the same objects/XX/ dir. The creation of the loose object files
is (AFAICS) safe from races, but the creation of the objects/XX/ dir in
which the loose objects reside is unsafe, for example:

Two concurrent fetches - A and B. As part of its fetch, A needs to store
12aaaaa as a loose object. B, on the other hand, needs to store 12bbbbb
as a loose object. The objects/12 directory does not already exist.
Concurrently, both A and B determine that they need to create the
objects/12 directory (because their first call to git_mkstemp_mode()
within create_tmpfile() fails witn ENOENT). One of them - let's say A -
executes the following mkdir() call before the other. This first call
returns success, and A moves on. When B gets around to calling mkdir(),
it fails with EEXIST, because A won the race. The mkdir() error causes B
to return -1 from create_tmpfile(), which propagates all the way,
resulting in the fetch failing with:

  error: unable to create temporary file: File exists
  fatal: failed to write object
  fatal: unpack-objects failed

Although it's hard to add a testcase reproducing this issue, it's easy
to provoke if we insert a sleep after the

  if (mkdir(buffer, 0777) || adjust_shared_perm(buffer))
      return -1;

block, and then run two concurrent "git fetch"es against the same repo.

The fix is to simply handle mkdir() failing with EEXIST as a success.
If EEXIST is somehow returned for the wrong reasons (because the relevant
objects/XX is not a directory, or is otherwise unsuitable for object
storage), the following call to adjust_shared_perm(), or ultimately the
retried call to git_mkstemp_mode() will fail, and we end up returning
error from create_tmpfile() in any case.

Note that there are still cases where two users with unsuitable umasks
in a shared repo can end up in two races where one user first wins the
mkdir() race to create an objects/XX/ directory, and then the other user
wins the adjust_shared_perms() race to chmod() that directory, but fails
because it is (transiently, until the first users completes its chmod())
unwriteable to the other user. However, (an equivalent of) this race also
exists before this patch, and is made no worse by this patch.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-10-28 09:50:34 -07:00
block-sha1
builtin Merge branch 'jc/ls-files-killed-optim' into maint 2013-10-23 13:33:08 -07:00
compat Revert "compat/clipped-write.c: large write(2) fails on Mac OS X/XNU" 2013-08-20 11:11:08 -07:00
contrib git-remote-mediawiki: bugfix for pages w/ >500 revisions 2013-09-24 12:42:21 -07:00
Documentation Almost 1.8.4.2 ;-) 2013-10-23 13:34:39 -07:00
git-gui
git_remote_helpers
gitk-git
gitweb gitweb: allow extra breadcrumbs to prefix the trail 2013-07-04 21:52:15 -07:00
mergetools
perl Git.pm: revert _temp_cache use of temp_is_locked 2013-07-18 20:31:43 -07:00
po l10n: de.po: use "das Tag" instead of "der Tag" 2013-09-08 18:37:13 +02:00
ppc
t Merge branch 'jc/ls-files-killed-optim' into maint 2013-10-23 13:33:08 -07:00
templates Merge branch 'maint-1.8.3' into maint 2013-09-03 13:54:32 -07:00
vcs-svn
xdiff
.gitattributes
.gitignore Merge branch 'es/check-mailmap' 2013-07-22 11:24:14 -07:00
.mailmap Merge branch 'sb/mailmap-updates' 2013-08-13 10:49:33 -07:00
abspath.c
aclocal.m4
advice.c Rename advice.object_name_warning to objectNameWarning 2013-07-31 15:20:07 -07:00
advice.h Merge branch 'jk/gcc-function-attributes' 2013-07-22 11:23:59 -07:00
alias.c
alloc.c
archive-tar.c
archive-zip.c Merge branch 'sb/archive-zip-double-assignment-fix' into maint 2013-07-19 10:40:53 -07:00
archive.c
archive.h
argv-array.c
argv-array.h Add the LAST_ARG_MUST_BE_NULL macro 2013-07-19 09:26:15 -07:00
attr.c
attr.h
base85.c
bisect.c list-objects: reduce one argument in mark_edges_uninteresting 2013-08-28 11:54:18 -07:00
bisect.h
blob.c
blob.h
branch.c Merge branch 'jh/checkout-auto-tracking' into maint 2013-10-23 13:32:50 -07:00
branch.h
builtin.h builtin: add git-check-mailmap command 2013-07-13 10:19:37 -07:00
bulk-checkin.c stream_to_pack: xread does not guarantee to read all requested bytes 2013-08-20 11:20:53 -07:00
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
cache-tree.h Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
cache.h Merge branch 'ob/typofixes' 2013-08-01 12:01:01 -07:00
check-builtins.sh
check-racy.c
check_bindir
color.c
color.h
column.c
column.h
combine-diff.c Merge branch 'tr/log-full-diff-keep-true-parents' into maint 2013-09-18 11:59:05 -07:00
command-list.txt builtin: add git-check-mailmap command 2013-07-13 10:19:37 -07:00
commit-slab.h commit-slab.h: Fix memory allocation and addressing 2013-07-29 08:44:29 -07:00
commit.c Merge branch 'tr/log-full-diff-keep-true-parents' into maint 2013-09-18 11:59:05 -07:00
commit.h Merge branch 'nd/fetch-into-shallow' into maint 2013-10-23 13:32:17 -07:00
config.c Merge branch 'hv/config-from-blob' into maint 2013-09-05 14:40:18 -07:00
config.mak.in
config.mak.uname Revert "compat/clipped-write.c: large write(2) fails on Mac OS X/XNU" 2013-08-20 11:11:08 -07:00
configure.ac configure: fix option help message for --disable-pthreads 2013-06-28 10:49:26 -07:00
connect.c
connected.c
connected.h
convert.c typofix: in-code comments 2013-07-22 16:06:49 -07:00
convert.h typofix: in-code comments 2013-07-22 16:06:49 -07:00
copy.c
COPYING
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c Merge branch 'sb/misc-fixes' 2013-07-24 19:20:59 -07:00
date.c
decorate.c
decorate.h
delta.h
diff-delta.c
diff-lib.c
diff-no-index.c
diff.c Merge branch 'ob/typofixes' 2013-07-24 19:23:01 -07:00
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c Merge branch 'rs/pickaxe-simplify' 2013-07-12 12:04:17 -07:00
diffcore-rename.c
diffcore.h
dir.c Merge branch 'jc/ls-files-killed-optim' into maint 2013-10-23 13:33:08 -07:00
dir.h ls-files -k: a directory only can be killed if the index has a non-directory 2013-08-15 13:50:34 -07:00
editor.c
entry.c Merge branch 'nd/const-struct-cache-entry' 2013-07-22 11:24:01 -07:00
environment.c Merge branch 'nd/git-dir-pointing-at-gitfile' into maint 2013-10-17 15:45:55 -07:00
exec_cmd.c
exec_cmd.h Add the LAST_ARG_MUST_BE_NULL macro 2013-07-19 09:26:15 -07:00
fast-import.c
fetch-pack.c Merge branch 'nd/fetch-into-shallow' into maint 2013-10-23 13:32:17 -07:00
fetch-pack.h
fmt-merge-msg.h
fsck.c
fsck.h
generate-cmdlist.sh
gettext.c
gettext.h
git-add--interactive.perl add--interactive: fix external command invocation on Windows 2013-09-04 10:35:25 -07:00
git-am.sh am: replace uses of --resolved with --continue 2013-06-27 09:37:12 -07:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Revert "compat/clipped-write.c: large write(2) fails on Mac OS X/XNU" 2013-08-20 11:11:08 -07:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl Merge branch 'jc/cvsserver-perm-bit-fix' into maint 2013-10-17 15:45:58 -07:00
git-difftool--helper.sh
git-difftool.perl
git-filter-branch.sh
git-instaweb.sh
git-lost-found.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh many small typofixes 2013-07-29 12:32:25 -07:00
git-mergetool.sh
git-p4.py many small typofixes 2013-07-29 12:32:25 -07:00
git-parse-remote.sh
git-pull.sh Merge branch 'jk/pull-into-dirty-unborn' into maint 2013-07-15 10:35:43 -07:00
git-quiltimport.sh
git-rebase--am.sh
git-rebase--interactive.sh Merge branch 'es/rebase-i-no-abbrev' into maint 2013-10-17 15:45:50 -07:00
git-rebase--merge.sh
git-rebase.sh Merge branch 'mm/rebase-continue-freebsd-WB' into maint 2013-09-26 12:41:14 -07:00
git-relink.perl
git-remote-testgit.sh
git-remote-testpy.py
git-repack.sh
git-request-pull.sh request-pull: improve error message for invalid revision args 2013-07-17 12:30:58 -07:00
git-send-email.perl send-email: don't call methods on undefined values 2013-09-10 08:49:22 -07:00
git-sh-i18n.sh
git-sh-setup.sh die_with_status: use "printf '%s\n'", not "echo" 2013-08-07 08:49:49 -07:00
git-stash.sh Revert "git stash: avoid data loss when "git stash save" kills a directory" 2013-08-14 09:53:43 -07:00
git-submodule.sh Merge branch 'fg/submodule-clone-depth' 2013-07-15 10:28:48 -07:00
git-svn.perl Merge branch 'vl/typofix' into maint 2013-07-19 10:42:57 -07:00
GIT-VERSION-GEN Git 1.8.4.1 2013-09-26 15:01:41 -07:00
git-web--browse.sh
git.c Merge branch 'es/check-mailmap' 2013-07-22 11:24:14 -07:00
git.rc
git.spec.in
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hash.c
hash.h
help.c cygwin: Remove the Win32 l/stat() implementation 2013-07-18 10:44:17 -07:00
help.h
hex.c
http-backend.c Merge branch 'bc/http-backend-allow-405' into maint 2013-10-17 15:46:00 -07:00
http-fetch.c
http-push.c list-objects: reduce one argument in mark_edges_uninteresting 2013-08-28 11:54:18 -07:00
http-walker.c
http.c Merge branch 'bc/http-keep-memory-given-to-curl' into maint 2013-07-15 10:36:01 -07:00
http.h
ident.c
imap-send.c
INSTALL
kwset.c typofix: in-code comments 2013-07-22 16:06:49 -07:00
kwset.h
levenshtein.c
levenshtein.h
LGPL-2.1
line-log.c line-log: fix "log -LN" crash when N is last line of file 2013-07-23 12:09:48 -07:00
line-log.h
line-range.c line-range: fix "blame -L X,-N" regression 2013-07-17 18:02:12 -07:00
line-range.h
list-objects.c list-objects: mark more commits as edges in mark_edges_uninteresting 2013-08-28 11:54:18 -07:00
list-objects.h list-objects: reduce one argument in mark_edges_uninteresting 2013-08-28 11:54:18 -07:00
ll-merge.c
ll-merge.h
lockfile.c lockfile: fix buffer overflow in path handling 2013-07-07 10:29:28 -07:00
log-tree.c log: use true parents for diff even when rewriting 2013-08-01 10:25:48 -07:00
log-tree.h
mailmap.c Merge branch 'jk/mailmap-incomplete-line' into maint 2013-09-18 11:57:33 -07:00
mailmap.h
Makefile Revert "compat/clipped-write.c: large write(2) fails on Mac OS X/XNU" 2013-08-20 11:11:08 -07:00
match-trees.c
merge-blobs.c
merge-blobs.h
merge-recursive.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
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 many small typofixes 2013-07-29 12:32:25 -07:00
object.c Merge branch 'sb/parse-object-buffer-eaten' 2013-07-22 11:23:33 -07:00
object.h
pack-check.c
pack-revindex.c pack-revindex: radix-sort the revindex 2013-07-12 09:20:54 -07:00
pack-revindex.h
pack-write.c
pack.h
pager.c
parse-options-cb.c
parse-options.c
parse-options.h Merge branch 'maint' 2013-08-09 15:49:55 -07:00
patch-delta.c
patch-ids.c
patch-ids.h
path.c Merge branch 'rj/cygwin-clarify-use-of-cheating-lstat' 2013-08-02 11:01:01 -07:00
pathspec.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
pretty.c teach format-patch to place other authors into in-body "From" 2013-07-03 12:11:04 -07:00
prio-queue.c
prio-queue.h
progress.c
progress.h
prompt.c
prompt.h
quote.c write_name{_quoted_relative,}(): remove redundant parameters 2013-06-26 11:22:06 -07:00
quote.h write_name{_quoted_relative,}(): remove redundant parameters 2013-06-26 11:22:06 -07:00
reachable.c
reachable.h
read-cache.c many small typofixes 2013-07-29 12:32:25 -07:00
README
reflog-walk.c
reflog-walk.h
refs.c Revert "Add new @ shortcut for HEAD" 2013-08-14 15:04:24 -07:00
refs.h
RelNotes Start preparing for 1.8.4.2 2013-10-17 15:50:45 -07:00
remote-curl.c remote-http: use argv-array 2013-07-09 12:34:16 -07:00
remote-testsvn.c
remote.c Merge branch 'bc/push-match-many-refs' 2013-07-18 12:48:25 -07:00
remote.h
replace_object.c
rerere.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
rerere.h
resolve-undo.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
resolve-undo.h
revision.c log: use true parents for diff when walking reflogs 2013-08-05 08:27:00 -07:00
revision.h log: use true parents for diff even when rewriting 2013-08-01 10:25:48 -07:00
run-command.c Merge branch 'tr/fd-gotcha-fixes' 2013-07-22 11:23:13 -07:00
run-command.h Add the LAST_ARG_MUST_BE_NULL macro 2013-07-19 09:26:15 -07:00
send-pack.c
send-pack.h
sequencer.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
sequencer.h
server-info.c
setup.c Merge branch 'jx/clean-interactive' 2013-07-22 11:24:11 -07:00
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1-lookup.c
sha1-lookup.h
sha1_file.c sha1_file.c:create_tmpfile(): Fix race when creating loose object dirs 2013-10-28 09:50:34 -07:00
sha1_name.c Revert "Add new @ shortcut for HEAD" 2013-08-14 15:04:24 -07:00
shallow.c shallow: add setup_temporary_shallow() 2013-08-28 11:51:54 -07:00
shell.c Merge branch 'tr/protect-low-3-fds' 2013-07-22 11:23:35 -07:00
shortlog.h
show-index.c
sideband.c
sideband.h
sigchain.c
sigchain.h
strbuf.c
strbuf.h
streaming.c Merge branch 'jk/cat-file-batch-optim' 2013-07-24 19:21:21 -07:00
streaming.h
string-list.c
string-list.h
submodule.c Merge branch 'jl/some-submodule-config-are-not-boolean' into maint 2013-09-18 11:59:35 -07:00
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 Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
test-genrandom.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: run testcases with POSIX absolute paths on Windows 2013-06-26 11:25:12 -07:00
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-wildmatch.c
thread-utils.c
thread-utils.h
trace.c add missing "format" function attributes 2013-07-09 22:23:04 -07:00
transport-helper.c many small typofixes 2013-07-29 12:32:25 -07:00
transport.c fetch: work around "transport-take-over" hack 2013-08-07 16:24:30 -07:00
transport.h fetch: work around "transport-take-over" hack 2013-08-07 16:24:30 -07:00
tree-diff.c
tree-walk.c traverse_trees(): clarify return value of the callback 2013-07-19 15:29:41 -07:00
tree-walk.h
tree.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
tree.h
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Convert "struct cache_entry *" to "const ..." wherever possible 2013-07-09 09:12:48 -07:00
unpack-trees.h
upload-pack.c Merge branch 'nd/fetch-into-shallow' into maint 2013-10-23 13:32:17 -07:00
url.c
url.h
usage.c
userdiff.c
userdiff.h
utf8.c
utf8.h add missing "format" function attributes 2013-07-09 22:23:04 -07:00
varint.c
varint.h
version.c
version.h
walker.c
walker.h
wildmatch.c
wildmatch.h
wrap-for-bin.sh wrap-for-bin: make bin-wrappers chainable 2013-07-08 08:55:34 -07:00
wrapper.c xread, xwrite: limit size of IO to 8MB 2013-08-20 11:10:59 -07:00
write_or_die.c
ws.c
wt-status.c Merge branch 'jx/clean-interactive' 2013-07-22 11:24:11 -07:00
wt-status.h wt-status: use "format" function attribute for status_printf 2013-07-09 22:23:11 -07:00
xdiff-interface.c
xdiff-interface.h
zlib.c

////////////////////////////////////////////////////////////////

	Git - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.

Git is an Open Source project covered by the GNU General Public
License version 2 (some parts of it are under different licenses,
compatible with the GPLv2). It was originally written by Linus
Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands, and
Documentation/git-commandname.txt for documentation of each command.
If git has been correctly installed, then the tutorial can also be
read with "man gittutorial" or "git help tutorial", and the
documentation of each command with "man git-commandname" or "git help
commandname".

CVS users may also want to read Documentation/gitcvs-migration.txt
("man gitcvs-migration" or "git help cvs-migration" if git is
installed).

Many Git online resources are accessible from http://git-scm.com/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org (read
Documentation/SubmittingPatches for instructions on patch submission).
To subscribe to the list, send an email with just "subscribe git" in
the body to majordomo@vger.kernel.org. The mailing list archives are
available at http://news.gmane.org/gmane.comp.version-control.git/,
http://marc.info/?l=git and other archival sites.

The maintainer frequently sends the "What's cooking" reports that
list the current status of various development topics to the mailing
list.  The discussion following them give a good reference for
project status, development direction and remaining tasks.