1
0
mirror of https://github.com/git/git.git synced 2024-09-25 20:22:43 +02:00
git/builtin
Jeff King 2fa233a554 pack-objects: handle island check for "external" delta base
Two recent topics, jk/pack-delta-reuse-with-bitmap and
cc/delta-islands, can have a funny interaction. When
checking if we can reuse an on-disk delta, the first topic
allows base_entry to be NULL when we find an object that's
not in the packing list. But the latter topic introduces a
call to in_same_island(), which needs to look at
base_entry->idx.oid. When these two features are used
together, we might try to dereference a NULL base_entry.

In practice, this doesn't really happen. We'd generally only
use delta islands when packing to disk, since the whole
point is to optimize the pack for serving fetches later. And
the new delta-reuse code relies on having used reachability
bitmaps to determine the set of objects, which we would
typically only do when serving an actual fetch.

However, it is technically possible to combine these
features. And even without doing so, building with
"SANITIZE=address,undefined" will cause t5310.46 to
complain.  Even though that test does not have delta islands
enabled, we still take the address of the NULL entry to pass
to in_same_island(). That function then promptly returns
without dereferencing the value when it sees that islands
are not enabled, but it's enough to trigger a sanitizer
error.

The solution is straight-forward: when both features are
used together, we should pass the oid of the found base to
in_same_island().

This is tricky to do inside a single "if" statement. And
after the merge in f3504ea3dd (Merge branch
'cc/delta-islands', 2018-09-17), that "if" condition is
already getting pretty unwieldy. So this patch moves the
logic into a helper function, where we can easily use
multiple return paths. The result is a bit longer, but the
logic should be much easier to follow.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-19 12:03:35 -07:00
..
add.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
am.c Merge branch 'en/directory-renames-nothanks' 2018-09-04 14:31:38 -07:00
annotate.c
apply.c apply.c: make init_apply_state() take a struct repository 2018-08-13 14:14:44 -07:00
archive.c archive.c: avoid access to the_index 2018-08-13 14:14:43 -07:00
bisect--helper.c
blame.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
branch.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
bundle.c
cat-file.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
check-attr.c attr: remove index from git_attr_set_direction() 2018-08-13 14:14:43 -07:00
check-ignore.c
check-mailmap.c
check-ref-format.c
checkout-index.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
checkout.c Merge branch 'bp/checkout-new-branch-optim' 2018-09-17 13:53:48 -07:00
clean.c dir.c: remove an implicit dependency on the_index in pathspec code 2018-08-13 14:14:42 -07:00
clone.c Merge branch 'nd/clone-case-smashing-warning' 2018-09-17 13:53:47 -07:00
column.c
commit-graph.c commit-graph: add free_commit_graph 2018-07-17 15:47:48 -07:00
commit-tree.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
commit.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
config.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
count-objects.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
credential.c
describe.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
diff-files.c
diff-index.c
diff-tree.c diff.c: move read_index() code back to the caller 2018-08-13 14:14:42 -07:00
diff.c tag: add repository argument to deref_tag 2018-06-29 10:43:39 -07:00
difftool.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
fast-export.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
fetch-pack.c
fetch.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
fmt-merge-msg.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
for-each-ref.c
fsck.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
gc.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
get-tar-commit-id.c
grep.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
hash-object.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
help.c Merge branch 'nd/command-list' 2018-06-01 15:06:37 +09:00
index-pack.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
init-db.c pass st.st_size as hint for strbuf_readlink() 2018-07-24 10:19:29 -07:00
interpret-trailers.c interpret-trailers: allow suppressing "---" divider 2018-08-23 10:08:51 -07:00
log.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
ls-files.c ls-files: correct index argument to get_convert_attr_ascii() 2018-08-13 14:14:43 -07:00
ls-remote.c Merge branch 'bw/server-options' 2018-05-23 14:38:15 +09:00
ls-tree.c
mailinfo.c
mailsplit.c
merge-base.c commit.h: remove method declarations 2018-07-20 15:38:54 -07:00
merge-file.c
merge-index.c
merge-ours.c
merge-recursive.c builtin/merge-recursive: make hash independent 2018-07-16 14:27:39 -07:00
merge-tree.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
merge.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
mktag.c
mktree.c
multi-pack-index.c multi-pack-index: provide more helpful usage info 2018-08-20 15:31:39 -07:00
mv.c Merge branch 'ma/lockfile-cleanup' 2018-05-30 14:04:05 +09:00
name-rev.c tag: add repository argument to deref_tag 2018-06-29 10:43:39 -07:00
notes.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
pack-objects.c pack-objects: handle island check for "external" delta base 2018-09-19 12:03:35 -07:00
pack-redundant.c treewide: use get_all_packs 2018-08-20 15:31:40 -07:00
pack-refs.c
patch-id.c
prune-packed.c for_each_*_object: move declarations to object-store.h 2018-08-14 12:29:57 -07:00
prune.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
pull.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
push.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
range-diff.c range-diff: update stale summary of --no-dual-color 2018-08-27 13:13:59 -07:00
read-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
rebase--helper.c
receive-pack.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
reflog.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
remote-ext.c
remote-fd.c
remote.c Merge branch 'ds/reachable' 2018-09-17 13:53:52 -07:00
repack.c Merge branch 'cc/delta-islands' 2018-09-17 13:53:55 -07:00
replace.c Merge branch 'nd/i18n' 2018-08-15 15:08:23 -07:00
rerere.c rerere: mark strings for translation 2018-08-06 13:22:34 -07:00
reset.c Merge branch 'jm/cache-entry-from-mem-pool' 2018-08-02 15:30:43 -07:00
rev-list.c Merge branch 'jk/rev-list-stdin-noop-is-ok' 2018-09-17 13:53:48 -07:00
rev-parse.c commit.h: remove method declarations 2018-07-20 15:38:54 -07:00
revert.c Merge branch 'nd/cherry-pick-quit-fix' 2018-08-20 12:41:34 -07:00
rm.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
send-pack.c Merge branch 'rs/opt-updates' 2018-08-27 14:33:43 -07:00
serve.c
shortlog.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
show-branch.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00
show-index.c make show-index a builtin 2018-05-29 00:28:22 +09:00
show-ref.c
stripspace.c
submodule--helper.c Merge branch 'sb/submodule-update-in-c' 2018-09-17 13:53:51 -07:00
symbolic-ref.c
tag.c Merge branch 'sb/object-store-grafts' 2018-07-18 12:20:28 -07:00
unpack-file.c
unpack-objects.c Merge branch 'jk/core-use-replace-refs' 2018-08-15 15:08:23 -07:00
update-index.c Merge branch 'nd/no-the-index' 2018-08-20 11:33:53 -07:00
update-ref.c update-ref --stdin: use skip_prefix() 2018-06-04 12:26:01 +09:00
update-server-info.c
upload-archive.c archive.c: avoid access to the_index 2018-08-13 14:14:43 -07:00
upload-pack.c check_replace_refs: rename to read_replace_refs 2018-07-18 15:45:14 -07:00
var.c
verify-commit.c commit: add repository argument to lookup_commit 2018-06-29 10:43:39 -07:00
verify-pack.c
verify-tag.c
worktree.c worktree: add --quiet option 2018-08-17 15:18:01 -07:00
write-tree.c Merge branch 'rs/parse-opt-lithelp' 2018-08-17 13:09:56 -07:00