Go to file
Taylor Blau 44f9fd6496 pack-bitmap.c: check preferred pack validity when opening MIDX bitmap
When pack-objects adds an entry to its packing list, it marks the
packfile and offset containing the object, which we may later use during
verbatim reuse (c.f., `write_reused_pack_verbatim()`).

If the packfile in question is deleted in the background (e.g., due to a
concurrent `git repack`), we'll die() as a result of calling use_pack(),
unless we have an open file descriptor on the pack itself. 4c08018204
(pack-objects: protect against disappearing packs, 2011-10-14) worked
around this by opening the pack ahead of time before recording it as a
valid source for reuse.

4c08018204's treatment meant that we could tolerate disappearing packs,
since it ensures we always have an open file descriptor on any pack that
we mark as a valid source for reuse. This tightens the race to only
happen when we need to close an open pack's file descriptor (c.f., the
caller of `packfile.c::get_max_fd_limit()`) _and_ that pack was deleted,
in which case we'll complain that a pack could not be accessed and
die().

The pack bitmap code does this, too, since prior to dc1daacdcc
(pack-bitmap: check pack validity when opening bitmap, 2021-07-23) it
was vulnerable to the same race.

The MIDX bitmap code does not do this, and is vulnerable to the same
race. Apply the same treatment as dc1daacdcc to the routine responsible
for opening the multi-pack bitmap's preferred pack to close this race.

This patch handles the "preferred" pack (c.f., the section
"multi-pack-index reverse indexes" in
Documentation/technical/pack-format.txt) specially, since pack-objects
depends on reusing exact chunks of that pack verbatim in
reuse_partial_packfile_from_bitmap(). So if that pack cannot be loaded,
the utility of a bitmap is significantly diminished.

Similar to dc1daacdcc, we could technically just add this check in
reuse_partial_packfile_from_bitmap(), since it's possible to use a MIDX
.bitmap without needing to open any of its packs. But it's simpler to do
the check as early as possible, covering all direct uses of the
preferred pack. Note that doing this check early requires us to call
prepare_midx_pack() early, too, so move the relevant part of that loop
from load_reverse_index() into open_midx_bitmap_1().

Subsequent patches handle the non-preferred packs in a slightly
different fashion.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-05-24 14:27:19 -07:00
.github Merge branch 'ab/ci-updates' 2021-12-15 09:39:49 -08:00
Documentation Git 2.35.3 2022-04-13 15:21:34 -07:00
block-sha1
builtin Merge branch 'en/keep-cwd' into maint 2022-01-28 16:45:52 -08:00
ci Merge branch 'ab/ci-updates' 2021-12-15 09:39:49 -08:00
compat Sync with 2.34.2 2022-03-24 00:31:42 +01:00
contrib Merge branch 'jl/subtree-check-parents-argument-passing-fix' 2022-01-10 11:52:54 -08:00
ewah
git-gui
gitk-git
gitweb
mergetools
negotiator
perl
po l10n: Update Catalan translation 2022-01-23 09:40:52 +01:00
ppc
refs Merge branch 'ab/refs-errno-cleanup' 2022-01-14 15:25:15 -08:00
reftable reftable tests: avoid "int" overflow, use "uint64_t" 2022-01-13 13:39:09 -08:00
sha1collisiondetection@855827c583
sha1dc
sha256
t Git 2.35.3 2022-04-13 15:21:34 -07:00
templates
trace2 Merge branch 'ab/run-command' 2021-12-15 09:39:47 -08:00
xdiff Merge branch 'pw/xdiff-classify-record-in-histogram' 2021-12-21 15:03:14 -08:00
.cirrus.yml
.clang-format
.editorconfig
.gitattributes
.gitignore
.gitmodules
.mailmap
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
GIT-VERSION-GEN Git 2.35.3 2022-04-13 15:21:34 -07:00
INSTALL
LGPL-2.1
Makefile Merge branch 'ab/makefile-hook-list-dependency-fix' 2022-01-10 11:52:52 -08:00
README.md
RelNotes Git 2.35.3 2022-04-13 15:21:34 -07:00
SECURITY.md
abspath.c
aclocal.m4
add-interactive.c
add-interactive.h
add-patch.c
advice.c
advice.h
alias.c
alias.h
alloc.c
alloc.h
apply.c Merge branch 'ja/i18n-similar-messages' 2022-01-10 11:52:56 -08:00
apply.h git-apply: add --allow-empty flag 2021-12-13 14:30:25 -08:00
archive-tar.c
archive-zip.c
archive.c i18n: factorize "--foo requires --bar" and the like 2022-01-05 13:31:00 -08:00
archive.h
attr.c
attr.h
banned.h
base85.c
bisect.c
bisect.h
blame.c
blame.h
blob.c
blob.h
bloom.c
bloom.h
branch.c Merge branch 'ak/protect-any-current-branch' 2022-01-12 15:11:41 -08:00
branch.h branch: add flags and config to inherit tracking 2021-12-20 22:40:21 -08:00
builtin.h
bulk-checkin.c
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c Merge branch 'vd/sparse-reset' 2021-12-10 14:35:12 -08:00
cache-tree.h
cache.h Merge branch 'ma/header-dup-cleanup' 2022-01-12 15:11:43 -08:00
cbtree.c cbtree: remove broken and unused cb_unlink 2021-12-07 15:18:35 -08:00
cbtree.h cbtree: remove broken and unused cb_unlink 2021-12-07 15:18:35 -08:00
chdir-notify.c
chdir-notify.h
check-builtins.sh
checkout.c
checkout.h
chunk-format.c
chunk-format.h
color.c
color.h
column.c
column.h
combine-diff.c
command-list.txt
commit-graph.c commit-graph: return if there is no git directory 2021-12-06 09:55:05 -08:00
commit-graph.h
commit-reach.c
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c ssh signing: make verify-commit consider key lifetime 2021-12-09 13:38:04 -08:00
commit.h
common-main.c Merge branch 'en/keep-cwd' 2022-01-05 14:01:28 -08:00
config.c Merge branch 'js/branch-track-inherit' 2022-01-10 11:52:54 -08:00
config.h
config.mak.dev Makefile: FreeBSD cannot do C99-or-below build 2022-01-18 12:16:23 -08:00
config.mak.in
config.mak.uname Merge branch 'da/rhel7-lacks-uncompress2-and-c99' 2022-01-17 15:15:59 -08:00
configure.ac Merge branch 'hn/reftable' 2021-12-15 09:39:45 -08:00
connect.c
connect.h
connected.c
connected.h
convert.c
convert.h
copy.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c Merge branch 'rs/daemon-plug-leak' 2022-01-05 14:01:31 -08:00
date.c
decorate.c
decorate.h
delta-islands.c
delta-islands.h
delta.h
detect-compiler
diff-delta.c
diff-lib.c
diff-merges.c
diff-merges.h
diff-no-index.c
diff.c Merge branch 'ja/i18n-similar-messages' 2022-01-10 11:52:56 -08:00
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c
diffcore-rotate.c
diffcore.h
dir-iterator.c
dir-iterator.h
dir.c Merge branch 'ds/sparse-checkout-malformed-pattern-fix' 2022-01-10 11:52:49 -08:00
dir.h dir: new flag to remove_dir_recurse() to spare the original_cwd 2021-12-09 13:33:13 -08:00
editor.c
entry.c
entry.h
environment.c Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
environment.h
exec-cmd.c
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c i18n: factorize "--foo requires --bar" and the like 2022-01-05 13:31:00 -08:00
fetch-pack.h
fmt-merge-msg.c Merge branch 'fs/ssh-signing-key-lifetime' 2022-01-12 15:11:41 -08:00
fmt-merge-msg.h merge: allow to pretend a merge is made into a different branch 2021-12-20 14:55:02 -08:00
fsck.c
fsck.h
fsmonitor.c
fsmonitor.h
fuzz-commit-graph.c
fuzz-pack-headers.c
fuzz-pack-idx.c
generate-cmdlist.sh
generate-configlist.sh
generate-hooklist.sh
gettext.c
gettext.h
git-add--interactive.perl
git-archimport.perl
git-bisect.sh
git-compat-util.h Sync with 2.34.2 2022-03-24 00:31:42 +01:00
git-curl-compat.h
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
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 Merge branch 'jh/p4-remove-unused' 2022-01-10 11:52:50 -08:00
git-quiltimport.sh
git-request-pull.sh
git-send-email.perl
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git.c i18n: factorize "no directory given for --foo" 2022-01-05 13:31:00 -08:00
git.rc
gpg-interface.c Merge branch 'fs/ssh-signing-other-keytypes' 2021-12-21 15:03:16 -08:00
gpg-interface.h ssh signing: make verify-commit consider key lifetime 2021-12-09 13:38:04 -08:00
graph.c
graph.h
grep.c Merge branch 'lh/use-gnu-color-in-grep' 2022-01-10 11:52:54 -08:00
grep.h log: let --invert-grep only invert --grep 2021-12-17 14:13:08 -08:00
hash-lookup.c
hash-lookup.h
hash.h
hashmap.c
hashmap.h
help.c help: make auto-correction prompt more consistent 2021-12-16 13:49:39 -08:00
help.h
hex.c
hook.c
hook.h
http-backend.c Merge branch 'ab/usage-die-message' 2022-01-10 11:52:53 -08:00
http-fetch.c i18n: factorize "--foo requires --bar" and the like 2022-01-05 13:31:00 -08:00
http-push.c
http-walker.c
http.c
http.h
ident.c
imap-send.c
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c
list-objects-filter-options.h
list-objects-filter.c
list-objects-filter.h
list-objects.c
list-objects.h
list.h
ll-merge.c
ll-merge.h
lockfile.c
lockfile.h
log-tree.c ssh signing: make git log verify key lifetime 2021-12-09 13:38:04 -08:00
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-ort-wrappers.c
merge-ort-wrappers.h
merge-ort.c merge-ort: fix bug with renormalization and rename/delete conflicts 2021-12-30 10:40:26 -08:00
merge-ort.h
merge-recursive.c
merge-recursive.h
merge.c
mergesort.c
mergesort.h
midx.c
midx.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-file.c Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
object-name.c
object-store.h Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
object.c Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
object.h
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c
oidset.h
oidtree.c
oidtree.h
pack-bitmap-write.c
pack-bitmap.c pack-bitmap.c: check preferred pack validity when opening MIDX bitmap 2022-05-24 14:27:19 -07:00
pack-bitmap.h
pack-check.c
pack-objects.c
pack-objects.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
packfile.c Merge branch 'jt/pack-header-lshift-overflow' 2022-01-12 15:11:41 -08:00
packfile.h Merge branch 'tb/pack-revindex-on-disk-cleanup' 2021-12-15 09:39:50 -08:00
pager.c
parallel-checkout.c
parallel-checkout.h
parse-options-cb.c branch: add flags and config to inherit tracking 2021-12-20 22:40:21 -08:00
parse-options.c Merge branch 'ab/usage-die-message' 2022-01-10 11:52:53 -08:00
parse-options.h Merge branch 'js/branch-track-inherit' 2022-01-10 11:52:54 -08:00
patch-delta.c
patch-ids.c
patch-ids.h
path.c Sync with 2.33.2 2022-03-24 00:31:36 +01:00
path.h
pathspec.c
pathspec.h pathspec: use BUG(...) not die("BUG:%s:%d....", <file>, <line>) 2021-12-07 12:31:17 -08:00
pkt-line.c
pkt-line.h
preload-index.c
pretty.c Merge branch 'es/pretty-describe-more' 2021-12-15 09:39:48 -08:00
pretty.h
prio-queue.c
prio-queue.h
progress.c
progress.h
promisor-remote.c
promisor-remote.h
prompt.c
prompt.h
protocol-caps.c
protocol-caps.h
protocol.c
protocol.h
prune-packed.c
prune-packed.h
quote.c
quote.h
range-diff.c i18n: refactor "foo and bar are mutually exclusive" 2022-01-05 13:29:23 -08:00
range-diff.h
reachable.c
reachable.h
read-cache.c Merge branch 'vd/sparse-reset' 2021-12-10 14:35:12 -08:00
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c i18n: ref-filter: factorize "%(foo) atom used without %(bar) atom" 2022-01-05 13:31:00 -08:00
ref-filter.h
reflog-walk.c
reflog-walk.h
refs.c Merge branch 'ab/refs-errno-cleanup' 2022-01-14 15:25:15 -08:00
refs.h reflog + refs-backend: move "verbose" out of the backend 2021-12-22 16:24:14 -08:00
refspec.c
refspec.h
remote-curl.c
remote.c Merge branch 'gc/remote-with-fewer-static-global-variables' 2021-12-10 14:35:02 -08:00
remote.h
replace-object.c
replace-object.h
repo-settings.c repo-settings: prepare_repo_settings only in git repos 2021-12-06 09:55:06 -08:00
repository.c Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
repository.h Merge branch 'ns/tmp-objdir' 2022-01-03 16:24:15 -08:00
rerere.c
rerere.h
reset.c
reset.h
resolve-undo.c
resolve-undo.h
revision.c Merge branch 'ja/i18n-similar-messages' 2022-01-10 11:52:56 -08:00
revision.h log: let --invert-grep only invert --grep 2021-12-17 14:13:08 -08:00
run-command.c Merge branch 'ab/usage-die-message' 2022-01-10 11:52:53 -08:00
run-command.h
send-pack.c
send-pack.h
sequencer.c Merge branch 'en/keep-cwd' into maint 2022-01-28 16:45:52 -08:00
sequencer.h
serve.c
serve.h
server-info.c
setup.c Git 2.35.3 2022-04-13 15:21:34 -07:00
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
shallow.c
shallow.h
shell.c
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
simple-ipc.h
sparse-index.c
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
strbuf.c
strbuf.h strbuf.h: use BUG(...) not die("BUG: ...") 2021-12-07 12:31:16 -08:00
streaming.c
streaming.h
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c
sub-process.h
submodule-config.c
submodule-config.h
submodule.c
submodule.h
symlinks.c symlinks: do not include startup_info->original_cwd in dir removal 2021-12-09 13:33:13 -08:00
tag.c ssh signing: make verify-tag consider key lifetime 2021-12-09 13:38:04 -08:00
tag.h
tar.h
tempfile.c
tempfile.h
thread-utils.c
thread-utils.h
tmp-objdir.c tmp-objdir: new API for creating temporary writable databases 2021-12-08 14:06:36 -08:00
tmp-objdir.h tmp-objdir: new API for creating temporary writable databases 2021-12-08 14:06:36 -08:00
trace.c
trace.h
trace2.c
trace2.h
trailer.c
trailer.h
transport-helper.c
transport-internal.h
transport.c Merge branch 'ps/lockfile-cleanup-fix' 2022-01-12 15:11:43 -08:00
transport.h fetch: fix deadlock when cleaning up lockfiles in async signals 2022-01-07 13:49:19 -08:00
tree-diff.c pathspec: use BUG(...) not die("BUG:%s:%d....", <file>, <line>) 2021-12-07 12:31:17 -08:00
tree-walk.c
tree-walk.h
tree.c
tree.h
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unix-stream-server.c
unix-stream-server.h
unpack-trees.c Merge branch 'en/keep-cwd' 2022-01-05 14:01:28 -08:00
unpack-trees.h unpack-trees: refuse to remove startup_info->original_cwd 2021-12-09 13:33:12 -08:00
upload-pack.c upload-pack.c: increase output buffer size 2021-12-15 11:51:18 -08:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c config API: use get_error_routine(), not vreportf() 2021-12-07 13:25:16 -08:00
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
worktree.c
worktree.h
wrap-for-bin.sh
wrapper.c
write-or-die.c Merge branch 'ew/test-wo-fsync' 2021-12-15 09:39:52 -08:00
ws.c
wt-status.c Merge branch 'xw/am-empty' 2022-01-05 14:01:28 -08:00
wt-status.h
xdiff-interface.c
xdiff-interface.h
zlib.c

README.md

Build status

Git - fast, scalable, distributed revision control system

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.

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

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.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).

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 https://lore.kernel.org/git/, http://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

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.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (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