https://github.com/git/git
Revision c716fe4bd917e013bf376a678b3a924447777b2d authored by Jeff King on 12 March 2020, 05:31:11 UTC, committed by Jeff King on 12 March 2020, 06:55:24 UTC
The credential protocol can't represent newlines in values, but URLs can
embed percent-encoded newlines in various components. A previous commit
taught the low-level writing routines to die() when encountering this,
but we can be a little friendlier to the user by detecting them earlier
and handling them gracefully.

This patch teaches credential_from_url() to notice such components,
issue a warning, and blank the credential (which will generally result
in prompting the user for a username and password). We blank the whole
credential in this case. Another option would be to blank only the
invalid component. However, we're probably better off not feeding a
partially-parsed URL result to a credential helper. We don't know how a
given helper would handle it, so we're better off to err on the side of
matching nothing rather than something unexpected.

The die() call in credential_write() is _probably_ impossible to reach
after this patch. Values should end up in credential structs only by URL
parsing (which is covered here), or by reading credential protocol input
(which by definition cannot read a newline into a value). But we should
definitely keep the low-level check, as it's our final and most accurate
line of defense against protocol injection attacks. Arguably it could
become a BUG(), but it probably doesn't matter much either way.

Note that the public interface of credential_from_url() grows a little
more than we need here. We'll use the extra flexibility in a future
patch to help fsck catch these cases.
1 parent 17f1c0b
History
Tip revision: c716fe4bd917e013bf376a678b3a924447777b2d authored by Jeff King on 12 March 2020, 05:31:11 UTC
credential: detect unrepresentable values when parsing urls
Tip revision: c716fe4
File Mode Size
.github
Documentation
block-sha1
builtin
ci
compat
contrib
ewah
git-gui
gitk-git
gitweb
mergetools
perl
po
ppc
refs
sha1collisiondetection @ 19d97bf
sha1dc
t
templates
vcs-svn
xdiff
.clang-format -rw-r--r-- 4.5 KB
.gitattributes -rw-r--r-- 249 bytes
.gitignore -rw-r--r-- 3.1 KB
.gitmodules -rw-r--r-- 153 bytes
.mailmap -rw-r--r-- 14.5 KB
.travis.yml -rw-r--r-- 1.3 KB
.tsan-suppressions -rw-r--r-- 411 bytes
COPYING -rw-r--r-- 18.3 KB
GIT-VERSION-GEN -rwxr-xr-x 752 bytes
INSTALL -rw-r--r-- 10.0 KB
LGPL-2.1 -rw-r--r-- 26.2 KB
Makefile -rw-r--r-- 85.8 KB
README.md -rw-r--r-- 2.9 KB
RelNotes l--------- 33 bytes
abspath.c -rw-r--r-- 6.8 KB
aclocal.m4 -rw-r--r-- 1.4 KB
advice.c -rw-r--r-- 4.3 KB
advice.h -rw-r--r-- 1.0 KB
alias.c -rw-r--r-- 1.8 KB
alloc.c -rw-r--r-- 2.6 KB
apply.c -rw-r--r-- 129.0 KB
apply.h -rw-r--r-- 3.8 KB
archive-tar.c -rw-r--r-- 12.4 KB
archive-zip.c -rw-r--r-- 17.0 KB
archive.c -rw-r--r-- 14.7 KB
archive.h -rw-r--r-- 1.3 KB
argv-array.c -rw-r--r-- 1.7 KB
argv-array.h -rw-r--r-- 689 bytes
attr.c -rw-r--r-- 28.5 KB
attr.h -rw-r--r-- 2.2 KB
base85.c -rw-r--r-- 2.8 KB
bisect.c -rw-r--r-- 26.5 KB
bisect.h -rw-r--r-- 1.0 KB
blame.c -rw-r--r-- 49.7 KB
blame.h -rw-r--r-- 5.2 KB
blob.c -rw-r--r-- 401 bytes
blob.h -rw-r--r-- 666 bytes
branch.c -rw-r--r-- 9.9 KB
branch.h -rw-r--r-- 2.5 KB
builtin.h -rw-r--r-- 12.1 KB
bulk-checkin.c -rw-r--r-- 7.2 KB
bulk-checkin.h -rw-r--r-- 323 bytes
bundle.c -rw-r--r-- 12.4 KB
bundle.h -rw-r--r-- 725 bytes
cache-tree.c -rw-r--r-- 17.3 KB
cache-tree.h -rw-r--r-- 1.6 KB
cache.h -rw-r--r-- 68.2 KB
check-builtins.sh -rwxr-xr-x 596 bytes
check-racy.c -rw-r--r-- 523 bytes
check_bindir -rwxr-xr-x 374 bytes
checkout.c -rw-r--r-- 989 bytes
checkout.h -rw-r--r-- 339 bytes
color.c -rw-r--r-- 8.7 KB
color.h -rw-r--r-- 4.3 KB
column.c -rw-r--r-- 9.7 KB
column.h -rw-r--r-- 1.4 KB
combine-diff.c -rw-r--r-- 40.3 KB
command-list.txt -rw-r--r-- 8.8 KB
commit-slab.h -rw-r--r-- 4.7 KB
commit.c -rw-r--r-- 40.7 KB
commit.h -rw-r--r-- 11.7 KB
common-main.c -rw-r--r-- 1.1 KB
config.c -rw-r--r-- 72.7 KB
config.h -rw-r--r-- 9.7 KB
config.mak.in -rw-r--r-- 540 bytes
config.mak.uname -rw-r--r-- 16.5 KB
configure.ac -rw-r--r-- 36.6 KB
connect.c -rw-r--r-- 27.2 KB
connect.h -rw-r--r-- 676 bytes
connected.c -rw-r--r-- 3.1 KB
connected.h -rw-r--r-- 1.5 KB
convert.c -rw-r--r-- 39.9 KB
convert.h -rw-r--r-- 3.7 KB
copy.c -rw-r--r-- 1.3 KB
credential-cache--daemon.c -rw-r--r-- 6.9 KB
credential-cache.c -rw-r--r-- 3.2 KB
credential-store.c -rw-r--r-- 5.0 KB
credential.c -rw-r--r-- 8.7 KB
credential.h -rw-r--r-- 1.5 KB
csum-file.c -rw-r--r-- 4.1 KB
csum-file.h -rw-r--r-- 1.3 KB
ctype.c -rw-r--r-- 2.6 KB
daemon.c -rw-r--r-- 34.7 KB
date.c -rw-r--r-- 27.8 KB
decorate.c -rw-r--r-- 1.8 KB
decorate.h -rw-r--r-- 1.4 KB
delta.h -rw-r--r-- 3.4 KB
diff-delta.c -rw-r--r-- 15.5 KB
diff-lib.c -rw-r--r-- 14.8 KB
diff-no-index.c -rw-r--r-- 6.8 KB
diff.c -rw-r--r-- 165.3 KB
diff.h -rw-r--r-- 14.0 KB
diffcore-break.c -rw-r--r-- 9.0 KB
diffcore-delta.c -rw-r--r-- 5.4 KB
diffcore-order.c -rw-r--r-- 2.4 KB
diffcore-pickaxe.c -rw-r--r-- 6.3 KB
diffcore-rename.c -rw-r--r-- 17.5 KB
diffcore.h -rw-r--r-- 4.8 KB
dir-iterator.c -rw-r--r-- 4.8 KB
dir-iterator.h -rw-r--r-- 2.7 KB
dir.c -rw-r--r-- 80.0 KB
dir.h -rw-r--r-- 11.3 KB
editor.c -rw-r--r-- 2.3 KB
entry.c -rw-r--r-- 12.5 KB
environment.c -rw-r--r-- 9.4 KB
exec_cmd.c -rw-r--r-- 3.2 KB
exec_cmd.h -rw-r--r-- 540 bytes
fast-import.c -rw-r--r-- 90.2 KB
fetch-object.c -rw-r--r-- 1.2 KB
fetch-object.h -rw-r--r-- 250 bytes
fetch-pack.c -rw-r--r-- 31.4 KB
fetch-pack.h -rw-r--r-- 1.7 KB
fmt-merge-msg.h -rw-r--r-- 187 bytes
fsck.c -rw-r--r-- 28.7 KB
fsck.h -rw-r--r-- 2.0 KB
fsmonitor.c -rw-r--r-- 7.1 KB
fsmonitor.h -rw-r--r-- 2.3 KB
generate-cmdlist.sh -rwxr-xr-x 946 bytes
gettext.c -rw-r--r-- 5.1 KB
gettext.h -rw-r--r-- 2.2 KB
git-add--interactive.perl -rwxr-xr-x 42.8 KB
git-archimport.perl -rwxr-xr-x 36.1 KB
git-bisect.sh -rwxr-xr-x 14.1 KB
git-compat-util.h -rw-r--r-- 33.1 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.9 KB
git-difftool--helper.sh -rwxr-xr-x 2.2 KB
git-filter-branch.sh -rwxr-xr-x 15.2 KB
git-instaweb.sh -rwxr-xr-x 18.1 KB
git-merge-octopus.sh -rwxr-xr-x 2.4 KB
git-merge-one-file.sh -rwxr-xr-x 3.6 KB
git-merge-resolve.sh -rwxr-xr-x 944 bytes
git-mergetool--lib.sh -rw-r--r-- 8.7 KB
git-mergetool.sh -rwxr-xr-x 10.1 KB
git-p4.py -rwxr-xr-x 141.8 KB
git-parse-remote.sh -rw-r--r-- 2.6 KB
git-quiltimport.sh -rwxr-xr-x 3.5 KB
git-rebase--am.sh -rw-r--r-- 2.6 KB
git-rebase--interactive.sh -rw-r--r-- 28.3 KB
git-rebase--merge.sh -rw-r--r-- 4.0 KB
git-rebase.sh -rwxr-xr-x 16.9 KB
git-remote-testgit.sh -rwxr-xr-x 2.9 KB
git-request-pull.sh -rwxr-xr-x 3.6 KB
git-send-email.perl -rwxr-xr-x 54.3 KB
git-sh-i18n.sh -rw-r--r-- 2.3 KB
git-sh-setup.sh -rw-r--r-- 9.1 KB
git-stash.sh -rwxr-xr-x 15.1 KB
git-submodule.sh -rwxr-xr-x 23.4 KB
git-svn.perl -rwxr-xr-x 62.9 KB
git-web--browse.sh -rwxr-xr-x 4.3 KB
git.c -rw-r--r-- 19.8 KB
git.rc -rw-r--r-- 592 bytes
gpg-interface.c -rw-r--r-- 6.3 KB
gpg-interface.h -rw-r--r-- 1.2 KB
graph.c -rw-r--r-- 36.3 KB
graph.h -rw-r--r-- 4.9 KB
grep.c -rw-r--r-- 50.3 KB
grep.h -rw-r--r-- 5.6 KB
hash.h -rw-r--r-- 2.9 KB
hashmap.c -rw-r--r-- 7.2 KB
hashmap.h -rw-r--r-- 14.2 KB
help.c -rw-r--r-- 11.6 KB
help.h -rw-r--r-- 1.1 KB
hex.c -rw-r--r-- 2.9 KB
http-backend.c -rw-r--r-- 16.6 KB
http-fetch.c -rw-r--r-- 2.2 KB
http-push.c -rw-r--r-- 49.8 KB
http-walker.c -rw-r--r-- 15.0 KB
http.c -rw-r--r-- 62.0 KB
http.h -rw-r--r-- 6.5 KB
ident.c -rw-r--r-- 12.5 KB
imap-send.c -rw-r--r-- 36.7 KB
iterator.h -rw-r--r-- 2.1 KB
khash.h -rw-r--r-- 12.6 KB
kwset.c -rw-r--r-- 20.5 KB
kwset.h -rw-r--r-- 2.5 KB
levenshtein.c -rw-r--r-- 2.5 KB
levenshtein.h -rw-r--r-- 203 bytes
line-log.c -rw-r--r-- 30.9 KB
line-log.h -rw-r--r-- 1.8 KB
line-range.c -rw-r--r-- 6.5 KB
line-range.h -rw-r--r-- 1.3 KB
list-objects-filter-options.c -rw-r--r-- 4.1 KB
list-objects-filter-options.h -rw-r--r-- 2.1 KB
list-objects-filter.c -rw-r--r-- 10.8 KB
list-objects-filter.h -rw-r--r-- 2.6 KB
list-objects.c -rw-r--r-- 9.3 KB
list-objects.h -rw-r--r-- 670 bytes
list.h -rw-r--r-- 5.6 KB
ll-merge.c -rw-r--r-- 10.5 KB
ll-merge.h -rw-r--r-- 567 bytes
lockfile.c -rw-r--r-- 5.6 KB
lockfile.h -rw-r--r-- 10.5 KB
log-tree.c -rw-r--r-- 25.2 KB
log-tree.h -rw-r--r-- 1.4 KB
mailinfo.c -rw-r--r-- 26.4 KB
mailinfo.h -rw-r--r-- 991 bytes
mailmap.c -rw-r--r-- 8.9 KB
mailmap.h -rw-r--r-- 271 bytes
match-trees.c -rw-r--r-- 8.1 KB
merge-blobs.c -rw-r--r-- 1.9 KB
merge-blobs.h -rw-r--r-- 194 bytes
merge-recursive.c -rw-r--r-- 63.8 KB
merge-recursive.h -rw-r--r-- 1.6 KB
merge.c -rw-r--r-- 3.2 KB
mergesort.c -rw-r--r-- 1.5 KB
mergesort.h -rw-r--r-- 574 bytes
name-hash.c -rw-r--r-- 18.5 KB
notes-cache.c -rw-r--r-- 2.2 KB
notes-cache.h -rw-r--r-- 498 bytes
notes-merge.c -rw-r--r-- 22.4 KB
notes-merge.h -rw-r--r-- 2.8 KB
notes-utils.c -rw-r--r-- 4.9 KB
notes-utils.h -rw-r--r-- 1.4 KB
notes.c -rw-r--r-- 36.2 KB
notes.h -rw-r--r-- 11.8 KB
object.c -rw-r--r-- 10.0 KB
object.h -rw-r--r-- 5.4 KB
oidmap.c -rw-r--r-- 1.4 KB
oidmap.h -rw-r--r-- 2.1 KB
oidset.c -rw-r--r-- 767 bytes
oidset.h -rw-r--r-- 2.0 KB
pack-bitmap-write.c -rw-r--r-- 12.2 KB
pack-bitmap.c -rw-r--r-- 24.8 KB
pack-bitmap.h -rw-r--r-- 1.7 KB
pack-check.c -rw-r--r-- 5.5 KB
pack-objects.c -rw-r--r-- 2.2 KB
pack-objects.h -rw-r--r-- 2.2 KB
pack-revindex.c -rw-r--r-- 5.5 KB
pack-revindex.h -rw-r--r-- 323 bytes
pack-write.c -rw-r--r-- 10.7 KB
pack.h -rw-r--r-- 3.4 KB
packfile.c -rw-r--r-- 48.7 KB
packfile.h -rw-r--r-- 5.4 KB
pager.c -rw-r--r-- 4.4 KB
parse-options-cb.c -rw-r--r-- 5.2 KB
parse-options.c -rw-r--r-- 18.6 KB
parse-options.h -rw-r--r-- 10.7 KB
patch-delta.c -rw-r--r-- 2.2 KB
patch-ids.c -rw-r--r-- 3.2 KB
patch-ids.h -rw-r--r-- 585 bytes
path.c -rw-r--r-- 36.1 KB
path.h -rw-r--r-- 5.1 KB
pathspec.c -rw-r--r-- 16.3 KB
pathspec.h -rw-r--r-- 3.2 KB
pkt-line.c -rw-r--r-- 8.6 KB
pkt-line.h -rw-r--r-- 4.1 KB
preload-index.c -rw-r--r-- 2.8 KB
pretty.c -rw-r--r-- 45.3 KB
pretty.h -rw-r--r-- 3.4 KB
prio-queue.c -rw-r--r-- 1.8 KB
prio-queue.h -rw-r--r-- 1.5 KB
progress.c -rw-r--r-- 6.1 KB
progress.h -rw-r--r-- 455 bytes
prompt.c -rw-r--r-- 1.4 KB
prompt.h -rw-r--r-- 168 bytes
protocol.c -rw-r--r-- 2.1 KB
protocol.h -rw-r--r-- 1.1 KB
quote.c -rw-r--r-- 11.2 KB
quote.h -rw-r--r-- 3.2 KB
reachable.c -rw-r--r-- 4.8 KB
reachable.h -rw-r--r-- 300 bytes
read-cache.c -rw-r--r-- 73.4 KB
ref-filter.c -rw-r--r-- 60.7 KB
ref-filter.h -rw-r--r-- 4.2 KB
reflog-walk.c -rw-r--r-- 8.2 KB
reflog-walk.h -rw-r--r-- 918 bytes
refs.c -rw-r--r-- 51.9 KB
refs.h -rw-r--r-- 28.9 KB
remote-curl.c -rw-r--r-- 28.2 KB
remote-testsvn.c -rw-r--r-- 8.2 KB
remote.c -rw-r--r-- 60.3 KB
remote.h -rw-r--r-- 8.7 KB
replace_object.c -rw-r--r-- 2.9 KB
repository.c -rw-r--r-- 5.6 KB
repository.h -rw-r--r-- 3.1 KB
rerere.c -rw-r--r-- 31.0 KB
rerere.h -rw-r--r-- 1.2 KB
resolve-undo.c -rw-r--r-- 4.3 KB
resolve-undo.h -rw-r--r-- 612 bytes
revision.c -rw-r--r-- 95.5 KB
revision.h -rw-r--r-- 8.1 KB
run-command.c -rw-r--r-- 38.9 KB
run-command.h -rw-r--r-- 7.6 KB
send-pack.c -rw-r--r-- 15.7 KB
send-pack.h -rw-r--r-- 840 bytes
sequencer.c -rw-r--r-- 95.8 KB
sequencer.h -rw-r--r-- 2.4 KB
server-info.c -rw-r--r-- 5.7 KB
setup.c -rw-r--r-- 33.0 KB
sh-i18n--envsubst.c -rw-r--r-- 10.1 KB
sha1-array.c -rw-r--r-- 1.2 KB
sha1-array.h -rw-r--r-- 585 bytes
sha1-lookup.c -rw-r--r-- 3.1 KB
sha1-lookup.h -rw-r--r-- 1.3 KB
sha1_file.c -rw-r--r-- 54.4 KB
sha1_name.c -rw-r--r-- 42.5 KB
sha1dc_git.c -rw-r--r-- 855 bytes
sha1dc_git.h -rw-r--r-- 618 bytes
shallow.c -rw-r--r-- 19.3 KB
shell.c -rw-r--r-- 4.5 KB
shortlog.h -rw-r--r-- 492 bytes
show-index.c -rw-r--r-- 2.2 KB
sideband.c -rw-r--r-- 3.1 KB
sideband.h -rw-r--r-- 259 bytes
sigchain.c -rw-r--r-- 1.1 KB
sigchain.h -rw-r--r-- 247 bytes
split-index.c -rw-r--r-- 9.6 KB
split-index.h -rw-r--r-- 1.2 KB
strbuf.c -rw-r--r-- 20.3 KB
strbuf.h -rw-r--r-- 20.9 KB
streaming.c -rw-r--r-- 11.8 KB
streaming.h -rw-r--r-- 507 bytes
string-list.c -rw-r--r-- 7.5 KB
string-list.h -rw-r--r-- 10.1 KB
sub-process.c -rw-r--r-- 5.4 KB
sub-process.h -rw-r--r-- 3.1 KB
submodule-config.c -rw-r--r-- 18.1 KB
submodule-config.h -rw-r--r-- 2.0 KB
submodule.c -rw-r--r-- 56.6 KB
submodule.h -rw-r--r-- 5.6 KB
symlinks.c -rw-r--r-- 9.3 KB
tag.c -rw-r--r-- 4.5 KB
tag.h -rw-r--r-- 610 bytes
tar.h -rw-r--r-- 644 bytes
tempfile.c -rw-r--r-- 8.3 KB
tempfile.h -rw-r--r-- 9.2 KB
thread-utils.c -rw-r--r-- 1.7 KB
thread-utils.h -rw-r--r-- 241 bytes
tmp-objdir.c -rw-r--r-- 6.4 KB
tmp-objdir.h -rw-r--r-- 1.5 KB
trace.c -rw-r--r-- 10.4 KB
trace.h -rw-r--r-- 4.3 KB
trailer.c -rw-r--r-- 28.8 KB
trailer.h -rw-r--r-- 2.3 KB
transport-helper.c -rw-r--r-- 36.4 KB
transport-internal.h -rw-r--r-- 2.1 KB
transport.c -rw-r--r-- 33.5 KB
transport.h -rw-r--r-- 6.8 KB
tree-diff.c -rw-r--r-- 17.9 KB
tree-walk.c -rw-r--r-- 29.1 KB
tree-walk.h -rw-r--r-- 3.2 KB
tree.c -rw-r--r-- 6.4 KB
tree.h -rw-r--r-- 1.1 KB
unicode_width.h -rw-r--r-- 8.5 KB
unimplemented.sh -rw-r--r-- 101 bytes
unix-socket.c -rw-r--r-- 2.4 KB
unix-socket.h -rw-r--r-- 158 bytes
unpack-trees.c -rw-r--r-- 57.4 KB
unpack-trees.h -rw-r--r-- 2.3 KB
upload-pack.c -rw-r--r-- 28.4 KB
url.c -rw-r--r-- 2.4 KB
url.h -rw-r--r-- 492 bytes
urlmatch.c -rw-r--r-- 18.1 KB
urlmatch.h -rw-r--r-- 2.0 KB
usage.c -rw-r--r-- 5.3 KB
userdiff.c -rw-r--r-- 9.9 KB
userdiff.h -rw-r--r-- 780 bytes
utf8.c -rw-r--r-- 16.8 KB
utf8.h -rw-r--r-- 2.4 KB
varint.c -rw-r--r-- 660 bytes
varint.h -rw-r--r-- 168 bytes
version.c -rw-r--r-- 718 bytes
version.h -rw-r--r-- 230 bytes
versioncmp.c -rw-r--r-- 5.2 KB
walker.c -rw-r--r-- 7.3 KB
walker.h -rw-r--r-- 1.1 KB
wildmatch.c -rw-r--r-- 7.8 KB
wildmatch.h -rw-r--r-- 293 bytes
worktree.c -rw-r--r-- 11.5 KB
worktree.h -rw-r--r-- 3.0 KB
wrap-for-bin.sh -rw-r--r-- 820 bytes
wrapper.c -rw-r--r-- 14.9 KB
write_or_die.c -rw-r--r-- 1.5 KB
ws.c -rw-r--r-- 9.4 KB
wt-status.c -rw-r--r-- 64.6 KB
wt-status.h -rw-r--r-- 3.7 KB
xdiff-interface.c -rw-r--r-- 7.3 KB
xdiff-interface.h -rw-r--r-- 1.7 KB
zlib.c -rw-r--r-- 6.1 KB

README.md

back to top