git-commit-vandalism/Documentation
Jeff King 947208b725 setup_traverse_info(): stop copying oid
We assume that if setup_traverse_info() is passed a non-empty "base"
string, that string is pointing into a tree object and we can read the
object oid by skipping past the trailing NUL.

As it turns out, this is not true for either of the two calls, and we
may end up reading garbage bytes:

  1. In git-merge-tree, our base string is either empty (in which case
     we'd never run this code), or it comes from our traverse_path()
     helper. The latter overallocates a buffer by the_hash_algo->rawsz
     bytes, but then fills it with only make_traverse_path(), leaving
     those extra bytes uninitialized (but part of a legitimate heap
     buffer).

  2. In unpack_trees(), we pass o->prefix, which is some arbitrary
     string from the caller. In "git read-tree --prefix=foo", for
     instance, it will point to the command-line parameter, and we'll
     read 20 bytes past the end of the string.

Interestingly, tools like ASan do not detect (2) because the process
argv is part of a big pre-allocated buffer. So we're reading trash, but
it's trash that's probably part of the next argument, or the
environment.

You can convince it to fail by putting something like this at the
beginning of common-main.c's main() function:

  {
	int i;
	for (i = 0; i < argc; i++)
		argv[i] = xstrdup_or_null(argv[i]);
  }

That puts the arguments into their own heap buffers, so running:

  make SANITIZE=address test

will find problems when "read-tree --prefix" is used (e.g., in t3030).

Doubly interesting, even with the hackery above, this does not fail
prior to ea82b2a085 (tree-walk: store object_id in a separate member,
2019-01-15). That commit switched setup_traverse_info() to actually
copying the hash, rather than simply pointing to it. That pointer was
always pointing to garbage memory, but that commit started actually
dereferencing the bytes, which is what triggers ASan.

That also implies that nobody actually cares about reading these oid
bytes anyway (or at least no path covered by our tests). And manual
inspection of the code backs that up (I'll follow this patch with some
cleanups that show definitively this is the case, but they're quite
invasive, so it's worth doing this fix on its own).

So let's drop the bogus hashcpy(), along with the confusing oversizing
in merge-tree.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-07-31 13:30:58 -07:00
..
config Merge branch 'dl/config-alias-doc' into maint 2019-07-29 12:38:15 -07:00
howto doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
RelNotes Merge fixes made on the 'master' front 2019-07-29 12:38:23 -07:00
technical setup_traverse_info(): stop copying oid 2019-07-31 13:30:58 -07:00
.gitattributes
.gitignore Merge branch 'js/misc-doc-fixes' 2019-05-09 00:37:27 +09:00
asciidoc.conf
asciidoctor-extensions.rb asciidoctor-extensions: fix spurious space after linkgit 2019-03-11 18:22:07 +09:00
blame-options.txt Merge branch 'bc/blame-doc-fix' 2017-02-24 10:48:08 -08:00
build-docdep.perl
cat-texi.perl Documentation: remove unneeded argument in cat-texi.perl 2017-01-23 10:56:47 -08:00
cmd-list.perl
CodingGuidelines Merge branch 'jc/post-c89-rules-doc' into maint 2019-07-29 12:38:23 -07:00
config.txt trace2: update docs to describe system/global config settings 2019-04-16 13:37:07 +09:00
date-formats.txt Merge branch 'lr/doc-fix-cet' into maint 2017-01-17 15:19:08 -08:00
diff-format.txt log,diff-tree: add --combined-all-paths option 2019-02-07 20:15:25 -08:00
diff-generate-patch.txt log,diff-tree: add --combined-all-paths option 2019-02-07 20:15:25 -08:00
diff-options.txt Merge branch 'nd/diff-parseopt-3' 2019-04-16 19:28:03 +09:00
doc-diff doc-diff: add --cut-header-footer 2019-03-18 15:54:17 +09:00
docbook-xsl.css
docbook.xsl
everyday.txto Documentation: fix linkgit references 2016-05-09 15:44:14 -07:00
fetch-options.txt clone: send server options when using protocol v2 2019-04-18 10:53:51 +09:00
fix-texi.perl
git-add.txt docs: move core.excludesFile from git-add to gitignore 2019-03-08 09:12:45 +09:00
git-am.txt am/cherry-pick/rebase/revert: document --rerere-autoupdate 2019-03-18 10:24:56 +09:00
git-annotate.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-apply.txt Merge branch 'nd/diff-apply-ita' 2018-06-25 13:22:36 -07:00
git-archimport.txt git-archimport.1: specify what kind of Arch we're talking about 2018-09-21 09:28:58 -07:00
git-archive.txt
git-bisect-lk2009.txt doc: fix ASCII art tab spacing 2018-10-23 12:23:09 +09:00
git-bisect.txt Merge branch 'ak/bisect-doc-typofix' 2018-04-25 13:28:56 +09:00
git-blame.txt diff: --indent-heuristic is no longer experimental 2017-11-02 14:51:24 +09:00
git-branch.txt Merge branch 'po/doc-branch' into maint 2019-07-29 12:38:16 -07:00
git-bundle.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-cat-file.txt Merge branch 'dt/cat-file-batch-ambiguous' 2019-02-06 22:05:21 -08:00
git-check-attr.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-check-ignore.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-check-mailmap.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-check-ref-format.txt Doc/check-ref-format: clarify information about @{-N} syntax 2017-12-19 10:00:45 -08:00
git-checkout-index.txt
git-checkout.txt Merge branch 'dl/branch-from-3dot-merge-base' 2019-05-19 16:45:28 +09:00
git-cherry-pick.txt cherry-pick/revert: add scissors line on merge conflict 2019-04-19 12:05:36 +09:00
git-cherry.txt
git-citool.txt
git-clean.txt git-clean.txt: clarify ignore pattern files 2019-03-08 09:11:21 +09:00
git-clone.txt docs: git-clone: list short form of options first 2019-07-02 12:11:40 -07:00
git-column.txt git-column.txt: fix section header 2018-12-26 15:29:30 -08:00
git-commit-graph.txt Doc: refer to the "commit-graph file" with dash 2018-09-27 15:29:12 -07:00
git-commit-tree.txt commit-tree: utilize parse-options api 2019-03-08 10:31:24 +09:00
git-commit.txt git-commit.txt: better description what it does 2019-02-04 10:00:01 -08:00
git-config.txt Merge branch 'ma/asciidoctor-fixes-more' 2019-04-16 19:28:04 +09:00
git-count-objects.txt count-objects: report alternates via verbose mode 2016-10-10 13:52:37 -07:00
git-credential-cache--daemon.txt
git-credential-cache.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-credential-store.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-credential.txt
git-cvsexportcommit.txt
git-cvsimport.txt Merge branch 'jk/doc-cvs-update' into maint 2016-10-03 13:22:25 -07:00
git-cvsserver.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-daemon.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
git-describe.txt describe doc: remove '7-char' abbreviation reference 2019-04-08 17:24:51 +09:00
git-diff-files.txt
git-diff-index.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-diff-tree.txt Documentation/git-diff-tree.txt: fix formatting 2019-04-01 15:17:47 +09:00
git-diff.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-difftool.txt difftool: fallback on merge.guitool 2019-05-13 23:11:59 +09:00
git-fast-export.txt fast-export: add a --show-original-ids option to show original names 2018-11-17 18:43:52 +09:00
git-fast-import.txt Merge branch 'ab/gc-docs' 2019-04-25 16:41:18 +09:00
git-fetch-pack.txt Documentation: fix several one-character-off spelling errors 2018-04-09 14:15:02 +09:00
git-fetch.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-filter-branch.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
git-fmt-merge-msg.txt config.txt: move fmt-merge-msg-config.txt to config/ 2018-10-29 10:17:01 +09:00
git-for-each-ref.txt ref-filter: add docs for new options 2018-12-28 10:08:11 -08:00
git-format-patch.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-fsck-objects.txt
git-fsck.txt Merge branch 'jk/fsck-doc' 2019-03-20 15:16:06 +09:00
git-gc.txt gc docs: remove incorrect reference to gc.auto=0 2019-04-08 17:01:10 +09:00
git-get-tar-commit-id.txt
git-grep.txt Documentation: turn middle-of-line tabs into spaces 2019-03-07 09:25:32 +09:00
git-gui.txt doc: git-gui browser does not default to HEAD 2017-01-13 12:23:28 -08:00
git-hash-object.txt hash-object doc: stop mentioning git-cvsimport 2019-05-28 10:47:42 -07:00
git-help.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
git-http-backend.txt Documentation: turn middle-of-line tabs into spaces 2019-03-07 09:25:32 +09:00
git-http-fetch.txt http-fetch: make -a standard behaviour 2018-04-24 10:55:02 +09:00
git-http-push.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-imap-send.txt git-imap-send.txt: move imap.* to a separate file 2018-10-29 10:17:02 +09:00
git-index-pack.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-init-db.txt
git-init.txt Merge branch 'km/init-doc-typofix' 2019-02-06 22:05:21 -08:00
git-instaweb.txt git-instaweb: add Python builtin http.server support 2019-01-28 10:57:44 -08:00
git-interpret-trailers.txt interpret-trailers.txt: start the desc line with a capital letter 2019-04-01 15:49:47 +09:00
git-log.txt Add 'human' date format documentation 2019-01-22 14:16:17 -08:00
git-ls-files.txt doc/ls-files: put nested list for "-t" option into block 2019-04-23 10:25:04 +09:00
git-ls-remote.txt Documentation: turn middle-of-line tabs into spaces 2019-03-07 09:25:32 +09:00
git-ls-tree.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
git-mailinfo.txt Merge branch 'va/mailinfo-doc-typofix' into maint 2016-05-26 13:17:14 -07:00
git-mailsplit.txt mailsplit: support unescaping mboxrd messages 2016-06-06 11:14:43 -07:00
git-merge-base.txt doc: fix ASCII art tab spacing 2018-10-23 12:23:09 +09:00
git-merge-file.txt
git-merge-index.txt
git-merge-one-file.txt
git-merge-tree.txt
git-merge.txt merge: tweak --rerere-autoupdate documentation 2019-03-18 10:24:58 +09:00
git-mergetool--lib.txt mergetool: use get_merge_tool function 2019-05-13 23:11:59 +09:00
git-mergetool.txt mergetool: fallback to tool when guitool unavailable 2019-05-13 23:11:59 +09:00
git-mktag.txt
git-mktree.txt Documentation: normalize spelling of 'normalised' 2018-04-09 14:15:07 +09:00
git-multi-pack-index.txt multi-pack-index: add 'verify' verb 2018-09-17 13:49:38 -07:00
git-mv.txt doc: typeset short command-line options as literal 2016-06-28 08:20:52 -07:00
git-name-rev.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-notes.txt Documentation: turn middle-of-line tabs into spaces 2019-03-07 09:25:32 +09:00
git-p4.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-pack-objects.txt list-objects: consume sparse tree walk 2019-01-17 13:44:39 -08:00
git-pack-redundant.txt
git-pack-refs.txt Documentation: remove --prune from pack-refs examples 2013-07-18 16:23:46 -07:00
git-parse-remote.txt
git-patch-id.txt doc: remove unsupported parameter from patch-id 2017-07-28 14:41:32 -07:00
git-prune-packed.txt
git-prune.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-pull.txt docs: say that --rebase=preserve is deprecated 2019-05-28 13:22:34 -07:00
git-push.txt push doc: document the DWYM behavior pushing to unqualified <dst> 2018-11-14 15:27:56 +09:00
git-quiltimport.txt git-quiltimport: add --keep-non-patch option 2019-01-07 15:29:34 -08:00
git-range-diff.txt range-diff doc: add a section about output stability 2018-11-12 12:05:38 +09:00
git-read-tree.txt Merge branch 'nd/checkout-m' 2019-04-25 16:41:14 +09:00
git-rebase.txt Merge branch 'js/rebase-deprecate-preserve-merges' 2019-05-30 10:50:45 -07:00
git-receive-pack.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-reflog.txt reflog expire: cover reflog from all worktrees 2018-10-22 13:32:54 +09:00
git-remote-ext.txt Merge branch 'js/check-docs-exe' 2019-04-22 11:14:46 +09:00
git-remote-fd.txt docs: move gitremote-helpers into section 7 2019-04-01 14:00:53 +09:00
git-remote-helpers.txto docs: move gitremote-helpers into section 7 2019-04-01 14:00:53 +09:00
git-remote.txt Merge branch 'nd/remote-update-doc' 2018-06-04 21:39:49 +09:00
git-repack.txt Merge branch 'cc/delta-islands' 2018-09-17 13:53:55 -07:00
git-replace.txt replace: introduce --convert-graft-file 2018-04-30 11:12:30 +09:00
git-request-pull.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-rerere.txt rerere doc: quote rerere.enabled 2019-04-08 17:23:25 +09:00
git-reset.txt Merge branch 'dl/reset-doc-no-wrt-abbrev' 2019-04-10 02:14:21 +09:00
git-rev-list.txt rev-list: add list-objects filtering support 2017-11-22 14:11:57 +09:00
git-rev-parse.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-revert.txt cherry-pick/revert: add scissors line on merge conflict 2019-04-19 12:05:36 +09:00
git-rm.txt treewide: correct several "up-to-date" to "up to date" 2017-08-23 12:17:22 -07:00
git-send-email.txt send-email: update documentation of required Perl modules 2019-05-31 14:41:41 -07:00
git-send-pack.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-sh-i18n--envsubst.txt
git-sh-i18n.txt
git-sh-setup.txt doc: more consistency in environment variables format 2016-06-08 12:04:37 -07:00
git-shell.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-shortlog.txt git-[short]log.txt: unify quoted standalone -- 2018-04-18 12:49:26 +09:00
git-show-branch.txt Documentation/git-show-branch: avoid literal {apostrophe} 2019-04-10 12:05:03 +09:00
git-show-index.txt show-index: update documentation for index v2 2018-05-29 00:28:22 +09:00
git-show-ref.txt git-show-ref.txt: fix order of flags 2019-01-10 10:29:05 -08:00
git-show.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
git-stage.txt
git-stash.txt stash: mention options in show synopsis 2019-03-07 09:41:40 +09:00
git-status.txt Documentation/git-status: fix titles in porcelain v2 section 2019-04-01 17:46:26 +09:00
git-stripspace.txt
git-submodule.txt Merge branch 'dl/submodule-set-branch' 2019-04-25 16:41:18 +09:00
git-svn.txt Merge branch 'tz/git-svn-doc-markup-fix' 2019-05-09 00:37:23 +09:00
git-symbolic-ref.txt
git-tag.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-tools.txt doc: replace or.cz gitwiki link with git.wiki.kernel.org 2017-04-20 22:05:37 -07:00
git-unpack-file.txt
git-unpack-objects.txt unpack-objects: add --max-input-size=<size> option 2016-08-24 12:31:05 -07:00
git-update-index.txt Merge branch 'jc/update-index-doc' 2018-08-20 11:33:50 -07:00
git-update-ref.txt Merge branch 'ah/doc-updates' into maint 2018-11-21 22:58:07 +09:00
git-update-server-info.txt
git-upload-archive.txt
git-upload-pack.txt doc: tidy asciidoc style 2019-01-23 11:37:29 -08:00
git-var.txt doc: keep first level section header in upper case 2018-05-02 17:03:33 +09:00
git-verify-commit.txt Merge branch 'dn/gpg-doc' into maint 2016-07-06 13:06:36 -07:00
git-verify-pack.txt
git-verify-tag.txt builtin/verify-tag: add --format to verify-tag 2017-01-17 16:10:22 -08:00
git-web--browse.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
git-whatchanged.txt
git-worktree.txt doc: fix typos in man pages 2019-03-18 14:45:21 +09:00
git-write-tree.txt
git.txt Document that 'git -C ""' works and doesn't change directory 2019-07-01 10:42:49 -07:00
gitattributes.txt Merge branch 'ab/doc-misc-typofixes' 2019-04-16 19:28:08 +09:00
gitcli.txt Use proper syntax for replaceables in command docs 2018-05-25 17:16:47 +09:00
gitcore-tutorial.txt treewide: correct several "up-to-date" to "up to date" 2017-08-23 12:17:22 -07:00
gitcredentials.txt doc: clarify gitcredentials path component matching 2018-09-27 15:24:50 -07:00
gitcvs-migration.txt Merge branch 'sb/doc-unify-bottom' 2017-02-15 12:54:20 -08:00
gitdiffcore.txt log -G: ignore binary files 2018-12-26 14:59:37 -08:00
giteveryday.txt Documentation: spelling and grammar fixes 2018-06-22 14:26:23 -07:00
gitglossary.txt Documentation: unify bottom "part of git suite" lines 2017-02-09 15:14:01 -08:00
githooks.txt Merge branch 'bp/post-index-change-hook' 2019-04-25 16:41:11 +09:00
gitignore.txt Merge branch 'an/ignore-doc-update' into maint 2019-07-25 14:27:13 -07:00
gitk.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
gitmodules.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
gitnamespaces.txt doc: mention transfer data leaks in more places 2016-11-14 11:23:07 -08:00
gitremote-helpers.txt Merge branch 'js/check-docs-exe' 2019-04-22 11:14:46 +09:00
gitrepository-layout.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
gitrevisions.txt push doc: correct lies about how push refspecs work 2018-08-31 14:04:06 -07:00
gitsubmodules.txt gitsubmodules: align html and nroff lists 2019-05-28 09:42:06 -07:00
gittutorial-2.txt Documentation: unify bottom "part of git suite" lines 2017-02-09 15:14:01 -08:00
gittutorial.txt treewide: correct several "up-to-date" to "up to date" 2017-08-23 12:17:22 -07:00
gitweb.conf.txt Merge branch 'cb/doco-mono' 2019-04-22 11:14:45 +09:00
gitweb.txt doc: don't use git.kernel.org as example gitweb URL 2019-06-24 12:37:21 -07:00
gitworkflows.txt Merge branch 'km/doc-workflows-typofix' 2018-06-18 10:18:42 -07:00
glossary-content.txt Merge branch 'tg/glossary-overlay' 2019-04-16 19:28:07 +09:00
howto-index.sh
i18n.txt doc: camelCase the i18n config variables to improve readability 2017-07-17 15:11:26 -07:00
install-doc-quick.sh install-doc-quick: allow specifying what ref to install 2017-12-12 16:49:40 -08:00
install-webdoc.sh install-webdoc.sh: use the $( ... ) construct for command substitution 2014-04-17 11:14:58 -07:00
line-range-format.txt
lint-gitlink.perl ci: validate "linkgit:" in documentation 2016-05-10 11:15:04 -07:00
mailmap.txt
Makefile Merge branch 'js/misc-doc-fixes' 2019-05-09 00:37:27 +09:00
manpage-1.72.xsl
manpage-base-url.xsl.in
manpage-base.xsl
manpage-bold-literal.xsl
manpage-normal.xsl
manpage-quote-apos.xsl
manpage-suppress-sp.xsl
merge-options.txt Merge branch 'vv/merge-squash-with-explicit-commit' into maint 2019-07-25 14:27:10 -07:00
merge-strategies.txt merge: add merge.renames config setting 2018-05-08 16:19:41 +09:00
pretty-formats.txt Merge branch 'aw/pretty-trailers' 2019-03-07 09:59:52 +09:00
pretty-options.txt Merge branch 'tr/doc-tt' into maint 2016-07-06 13:06:34 -07:00
pull-fetch-param.txt fetch doc: correct grammar in --force docs 2018-09-20 09:40:03 -07:00
rev-list-options.txt list-objects-filter: disable 'sparse:path' filters 2019-05-29 11:05:34 -07:00
revisions.txt Merge branch 'dl/rev-tilde-doc-clarify' 2019-05-13 23:50:34 +09:00
sequencer.txt doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
SubmittingPatches doc: format pathnames and URLs as monospace. 2019-03-13 11:14:22 +09:00
texi.xsl Documentation: add XSLT to fix DocBook for Texinfo 2017-01-23 10:56:53 -08:00
trace2-target-values.txt trace2: update docs to describe system/global config settings 2019-04-16 13:37:07 +09:00
transfer-data-leaks.txt doc: mention transfer data leaks in more places 2016-11-14 11:23:07 -08:00
urls-remotes.txt Documentation: match underline with the text 2015-10-22 10:16:12 -07:00
urls.txt docs: move gitremote-helpers into section 7 2019-04-01 14:00:53 +09:00
user-manual.conf
user-manual.txt checkout: describe_detached_head: remove ellipsis after committish 2017-12-06 07:32:40 -08:00