Hello community, here is the log from the commit of package git for openSUSE:Factory checked in at 2020-04-25 20:16:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/git (Old) and /work/SRC/openSUSE:Factory/.git.new.2738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "git" Sat Apr 25 20:16:43 2020 rev:248 rq:797168 version:2.26.2 Changes: -------- --- /work/SRC/openSUSE:Factory/git/git.changes 2020-04-19 21:35:32.738402061 +0200 +++ /work/SRC/openSUSE:Factory/.git.new.2738/git.changes 2020-04-25 20:20:07.173006930 +0200 @@ -1,0 +2,23 @@ +Tue Apr 21 19:41:46 UTC 2020 - Michal Suchanek <[email protected]> + +- With recent switch to protocol v2 people are reporting fetches transferring + unreasonable amount of data. Upstream proposes switching the protocol back + until the issue is properly diagnosed. The regression is problematic for + people with lower network connection speed. + Added: Revert-fetch-default-to-protocol-version-2.patch + +------------------------------------------------------------------- +Mon Apr 20 18:35:15 UTC 2020 - Andreas Stieger <[email protected]> + +- git 2.26.2: + * CVE-2020-11008: Specially crafted URLs may have tricked the + credentials helper to providing credential information that + is not appropriate for the protocol in use and host being + contacted (boo#1169936) + +------------------------------------------------------------------- +Mon Apr 20 07:19:07 UTC 2020 - Marketa Calabkova <[email protected]> + +- Submit to SLE15 / resubmit to Factory (bsc#1169786, jsc#SLE-12396, bsc#1149792) + +------------------------------------------------------------------- Old: ---- git-2.26.1.tar.sign git-2.26.1.tar.xz New: ---- Revert-fetch-default-to-protocol-version-2.patch git-2.26.2.tar.sign git-2.26.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ git.spec ++++++ --- /var/tmp/diff_new_pack.Y9bRvA/_old 2020-04-25 20:20:09.473011673 +0200 +++ /var/tmp/diff_new_pack.Y9bRvA/_new 2020-04-25 20:20:09.477011681 +0200 @@ -32,7 +32,7 @@ %endif Name: git -Version: 2.26.1 +Version: 2.26.2 Release: 0 Summary: Fast, scalable, distributed revision control system License: GPL-2.0-only @@ -58,6 +58,7 @@ Patch10: setup-don-t-fail-if-commondir-reference-is-deleted.patch Patch11: 0001-DOC-Move-to-DocBook-5-when-using-asciidoctor.patch Patch13: 0002-Also-use-DocBook-5-stylesheet-when-generating-HTML-o.patch +Patch14: Revert-fetch-default-to-protocol-version-2.patch BuildRequires: fdupes BuildRequires: gpg2 BuildRequires: libcurl-devel @@ -286,6 +287,7 @@ %patch10 -p1 %patch11 -p1 %patch13 -p1 +%patch14 -p1 %build cat > .make <<'EOF' ++++++ Revert-fetch-default-to-protocol-version-2.patch ++++++ >From 3063fdec2a274235925c1b202ba8c65537e48211 Mon Sep 17 00:00:00 2001 From: Michal Suchanek <[email protected]> Date: Tue, 21 Apr 2020 21:38:48 +0200 Subject: [PATCH] Revert "fetch: default to protocol version 2" This reverts commit 684ceae32dae726c6a5c693b257b156926aba8b7. Causes a lot of data fetched from the Linux tree. --- Documentation/config/protocol.txt | 2 +- protocol.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/config/protocol.txt b/Documentation/config/protocol.txt index 756591d77b08..0b40141613e3 100644 --- a/Documentation/config/protocol.txt +++ b/Documentation/config/protocol.txt @@ -48,7 +48,7 @@ protocol.version:: If set, clients will attempt to communicate with a server using the specified protocol version. If the server does not support it, communication falls back to version 0. - If unset, the default is `2`. + If unset, the default is `0`. Supported versions: + -- diff --git a/protocol.c b/protocol.c index 803bef5c87e0..d390391ebac8 100644 --- a/protocol.c +++ b/protocol.c @@ -39,7 +39,7 @@ enum protocol_version get_protocol_version_config(void) return env; } - return protocol_v2; + return protocol_v0; } enum protocol_version determine_protocol_version_server(void) -- 2.26.0 ++++++ git-2.26.1.tar.xz -> git-2.26.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.17.5.txt new/git-2.26.2/Documentation/RelNotes/2.17.5.txt --- old/git-2.26.1/Documentation/RelNotes/2.17.5.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.17.5.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,22 @@ +Git v2.17.5 Release Notes +========================= + +This release is to address a security issue: CVE-2020-11008 + +Fixes since v2.17.4 +------------------- + + * With a crafted URL that contains a newline or empty host, or lacks + a scheme, the credential helper machinery can be fooled into + providing credential information that is not appropriate for the + protocol in use and host being contacted. + + Unlike the vulnerability CVE-2020-5260 fixed in v2.17.4, the + credentials are not for a host of the attacker's choosing; instead, + they are for some unspecified host (based on how the configured + credential helper handles an absent "host" parameter). + + The attack has been made impossible by refusing to work with + under-specified credential patterns. + +Credit for finding the vulnerability goes to Carlo Arenas. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.18.4.txt new/git-2.26.2/Documentation/RelNotes/2.18.4.txt --- old/git-2.26.1/Documentation/RelNotes/2.18.4.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.18.4.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.18.4 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.19.5.txt new/git-2.26.2/Documentation/RelNotes/2.19.5.txt --- old/git-2.26.1/Documentation/RelNotes/2.19.5.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.19.5.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.19.5 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.20.4.txt new/git-2.26.2/Documentation/RelNotes/2.20.4.txt --- old/git-2.26.1/Documentation/RelNotes/2.20.4.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.20.4.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.20.4 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.21.3.txt new/git-2.26.2/Documentation/RelNotes/2.21.3.txt --- old/git-2.26.1/Documentation/RelNotes/2.21.3.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.21.3.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.21.3 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.22.4.txt new/git-2.26.2/Documentation/RelNotes/2.22.4.txt --- old/git-2.26.1/Documentation/RelNotes/2.22.4.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.22.4.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.22.4 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.23.3.txt new/git-2.26.2/Documentation/RelNotes/2.23.3.txt --- old/git-2.26.1/Documentation/RelNotes/2.23.3.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.23.3.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.23.3 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.24.3.txt new/git-2.26.2/Documentation/RelNotes/2.24.3.txt --- old/git-2.26.1/Documentation/RelNotes/2.24.3.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.24.3.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.24.3 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.25.4.txt new/git-2.26.2/Documentation/RelNotes/2.25.4.txt --- old/git-2.26.1/Documentation/RelNotes/2.25.4.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.25.4.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.25.4 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/Documentation/RelNotes/2.26.2.txt new/git-2.26.2/Documentation/RelNotes/2.26.2.txt --- old/git-2.26.1/Documentation/RelNotes/2.26.2.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/git-2.26.2/Documentation/RelNotes/2.26.2.txt 2020-04-20 17:52:30.000000000 +0200 @@ -0,0 +1,5 @@ +Git v2.26.2 Release Notes +========================= + +This release merges the security fix that appears in v2.17.5; see +the release notes for that version for details. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/GIT-VERSION-GEN new/git-2.26.2/GIT-VERSION-GEN --- old/git-2.26.1/GIT-VERSION-GEN 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/GIT-VERSION-GEN 2020-04-20 17:52:30.000000000 +0200 @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.26.1 +DEF_VER=v2.26.2 LF=' ' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/RelNotes new/git-2.26.2/RelNotes --- old/git-2.26.1/RelNotes 2020-04-25 20:20:10.877014567 +0200 +++ new/git-2.26.2/RelNotes 2020-04-25 20:20:10.885014584 +0200 @@ -1 +1 @@ -symbolic link to Documentation/RelNotes/2.26.1.txt +symbolic link to Documentation/RelNotes/2.26.2.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/configure new/git-2.26.2/configure --- old/git-2.26.1/configure 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/configure 2020-04-20 17:52:30.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for git 2.26.1. +# Generated by GNU Autoconf 2.69 for git 2.26.2. # # Report bugs to <[email protected]>. # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='git' PACKAGE_TARNAME='git' -PACKAGE_VERSION='2.26.1' -PACKAGE_STRING='git 2.26.1' +PACKAGE_VERSION='2.26.2' +PACKAGE_STRING='git 2.26.2' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='' @@ -1265,7 +1265,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures git 2.26.1 to adapt to many kinds of systems. +\`configure' configures git 2.26.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1327,7 +1327,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of git 2.26.1:";; + short | recursive ) echo "Configuration of git 2.26.2:";; esac cat <<\_ACEOF @@ -1472,7 +1472,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -git configure 2.26.1 +git configure 2.26.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1952,7 +1952,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by git $as_me 2.26.1, which was +It was created by git $as_me 2.26.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -8360,7 +8360,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by git $as_me 2.26.1, which was +This file was extended by git $as_me 2.26.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8417,7 +8417,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -git config.status 2.26.1 +git config.status 2.26.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/credential.c new/git-2.26.2/credential.c --- old/git-2.26.1/credential.c 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/credential.c 2020-04-20 17:52:30.000000000 +0200 @@ -88,6 +88,11 @@ struct urlmatch_config config = { STRING_LIST_INIT_DUP }; struct strbuf url = STRBUF_INIT; + if (!c->host) + die(_("refusing to work with credential missing host field")); + if (!c->protocol) + die(_("refusing to work with credential missing protocol field")); + if (c->configured) return; @@ -222,8 +227,11 @@ return 0; } -static void credential_write_item(FILE *fp, const char *key, const char *value) +static void credential_write_item(FILE *fp, const char *key, const char *value, + int required) { + if (!value && required) + BUG("credential value for %s is missing", key); if (!value) return; if (strchr(value, '\n')) @@ -233,11 +241,11 @@ void credential_write(const struct credential *c, FILE *fp) { - credential_write_item(fp, "protocol", c->protocol); - credential_write_item(fp, "host", c->host); - credential_write_item(fp, "path", c->path); - credential_write_item(fp, "username", c->username); - credential_write_item(fp, "password", c->password); + credential_write_item(fp, "protocol", c->protocol, 1); + credential_write_item(fp, "host", c->host, 1); + credential_write_item(fp, "path", c->path, 0); + credential_write_item(fp, "username", c->username, 0); + credential_write_item(fp, "password", c->password, 0); } static int run_credential_helper(struct credential *c, @@ -383,8 +391,11 @@ * (3) proto://<user>:<pass>@<host>/... */ proto_end = strstr(url, "://"); - if (!proto_end) - return 0; + if (!proto_end || proto_end == url) { + if (!quiet) + warning(_("url has no scheme: %s"), url); + return -1; + } cp = proto_end + 3; at = strchr(cp, '@'); colon = strchr(cp, ':'); @@ -409,10 +420,8 @@ host = at + 1; } - if (proto_end - url > 0) - c->protocol = xmemdupz(url, proto_end - url); - if (slash - host > 0) - c->host = url_decode_mem(host, slash - host); + c->protocol = xmemdupz(url, proto_end - url); + c->host = url_decode_mem(host, slash - host); /* Trim leading and trailing slashes from path */ while (*slash == '/') slash++; @@ -436,8 +445,6 @@ void credential_from_url(struct credential *c, const char *url) { - if (credential_from_url_gently(c, url, 0) < 0) { - warning(_("skipping credential lookup for url: %s"), url); - credential_clear(c); - } + if (credential_from_url_gently(c, url, 0) < 0) + die(_("credential url cannot be parsed: %s"), url); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/fsck.c new/git-2.26.2/fsck.c --- old/git-2.26.1/fsck.c 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/fsck.c 2020-04-20 17:52:30.000000000 +0200 @@ -9,6 +9,7 @@ #include "tag.h" #include "fsck.h" #include "refs.h" +#include "url.h" #include "utf8.h" #include "decorate.h" #include "oidset.h" @@ -911,17 +912,147 @@ return ret; } +/* + * Like builtin/submodule--helper.c's starts_with_dot_slash, but without + * relying on the platform-dependent is_dir_sep helper. + * + * This is for use in checking whether a submodule URL is interpreted as + * relative to the current directory on any platform, since \ is a + * directory separator on Windows but not on other platforms. + */ +static int starts_with_dot_slash(const char *str) +{ + return str[0] == '.' && (str[1] == '/' || str[1] == '\\'); +} + +/* + * Like starts_with_dot_slash, this is a variant of submodule--helper's + * helper of the same name with the twist that it accepts backslash as a + * directory separator even on non-Windows platforms. + */ +static int starts_with_dot_dot_slash(const char *str) +{ + return str[0] == '.' && starts_with_dot_slash(str + 1); +} + +static int submodule_url_is_relative(const char *url) +{ + return starts_with_dot_slash(url) || starts_with_dot_dot_slash(url); +} + +/* + * Count directory components that a relative submodule URL should chop + * from the remote_url it is to be resolved against. + * + * In other words, this counts "../" components at the start of a + * submodule URL. + * + * Returns the number of directory components to chop and writes a + * pointer to the next character of url after all leading "./" and + * "../" components to out. + */ +static int count_leading_dotdots(const char *url, const char **out) +{ + int result = 0; + while (1) { + if (starts_with_dot_dot_slash(url)) { + result++; + url += strlen("../"); + continue; + } + if (starts_with_dot_slash(url)) { + url += strlen("./"); + continue; + } + *out = url; + return result; + } +} +/* + * Check whether a transport is implemented by git-remote-curl. + * + * If it is, returns 1 and writes the URL that would be passed to + * git-remote-curl to the "out" parameter. + * + * Otherwise, returns 0 and leaves "out" untouched. + * + * Examples: + * http::https://example.com/repo.git -> 1, https://example.com/repo.git + * https://example.com/repo.git -> 1, https://example.com/repo.git + * git://example.com/repo.git -> 0 + * + * This is for use in checking for previously exploitable bugs that + * required a submodule URL to be passed to git-remote-curl. + */ +static int url_to_curl_url(const char *url, const char **out) +{ + /* + * We don't need to check for case-aliases, "http.exe", and so + * on because in the default configuration, is_transport_allowed + * prevents URLs with those schemes from being cloned + * automatically. + */ + if (skip_prefix(url, "http::", out) || + skip_prefix(url, "https::", out) || + skip_prefix(url, "ftp::", out) || + skip_prefix(url, "ftps::", out)) + return 1; + if (starts_with(url, "http://") || + starts_with(url, "https://") || + starts_with(url, "ftp://") || + starts_with(url, "ftps://")) { + *out = url; + return 1; + } + return 0; +} + static int check_submodule_url(const char *url) { - struct credential c = CREDENTIAL_INIT; - int ret; + const char *curl_url; if (looks_like_command_line_option(url)) return -1; - ret = credential_from_url_gently(&c, url, 1); - credential_clear(&c); - return ret; + if (submodule_url_is_relative(url)) { + char *decoded; + const char *next; + int has_nl; + + /* + * This could be appended to an http URL and url-decoded; + * check for malicious characters. + */ + decoded = url_decode(url); + has_nl = !!strchr(decoded, '\n'); + + free(decoded); + if (has_nl) + return -1; + + /* + * URLs which escape their root via "../" can overwrite + * the host field and previous components, resolving to + * URLs like https::example.com/submodule.git and + * https:///example.com/submodule.git that were + * susceptible to CVE-2020-11008. + */ + if (count_leading_dotdots(url, &next) > 0 && + (*next == ':' || *next == '/')) + return -1; + } + + else if (url_to_curl_url(url, &curl_url)) { + struct credential c = CREDENTIAL_INIT; + int ret = 0; + if (credential_from_url_gently(&c, curl_url, 1) || + !*c.host) + ret = -1; + credential_clear(&c); + return ret; + } + + return 0; } struct fsck_gitmodules_data { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/http.c new/git-2.26.2/http.c --- old/git-2.26.1/http.c 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/http.c 2020-04-20 17:52:30.000000000 +0200 @@ -558,6 +558,7 @@ return 0; if (!cert_auth.password) { cert_auth.protocol = xstrdup("cert"); + cert_auth.host = xstrdup(""); cert_auth.username = xstrdup(""); cert_auth.path = xstrdup(ssl_cert); credential_fill(&cert_auth); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/t/t0300-credentials.sh new/git-2.26.2/t/t0300-credentials.sh --- old/git-2.26.1/t/t0300-credentials.sh 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/t/t0300-credentials.sh 2020-04-20 17:52:30.000000000 +0200 @@ -22,6 +22,11 @@ exit 0 EOF + write_script git-credential-quit <<-\EOF && + . ./dump + echo quit=1 + EOF + write_script git-credential-verbatim <<-\EOF && user=$1; shift pass=$1; shift @@ -35,43 +40,71 @@ test_expect_success 'credential_fill invokes helper' ' check fill "verbatim foo bar" <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=foo password=bar -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com EOF ' test_expect_success 'credential_fill invokes multiple helpers' ' check fill useless "verbatim foo bar" <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=foo password=bar -- useless: get + useless: protocol=http + useless: host=example.com verbatim: get + verbatim: protocol=http + verbatim: host=example.com EOF ' test_expect_success 'credential_fill stops when we get a full response' ' check fill "verbatim one two" "verbatim three four" <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=one password=two -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com EOF ' test_expect_success 'credential_fill continues through partial response' ' check fill "verbatim one \"\"" "verbatim two three" <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=two password=three -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com verbatim: get + verbatim: protocol=http + verbatim: host=example.com verbatim: username=one EOF ' @@ -97,14 +130,20 @@ test_expect_success 'credential_approve calls all helpers' ' check approve useless "verbatim one two" <<-\EOF + protocol=http + host=example.com username=foo password=bar -- -- useless: store + useless: protocol=http + useless: host=example.com useless: username=foo useless: password=bar verbatim: store + verbatim: protocol=http + verbatim: host=example.com verbatim: username=foo verbatim: password=bar EOF @@ -112,6 +151,8 @@ test_expect_success 'do not bother storing password-less credential' ' check approve useless <<-\EOF + protocol=http + host=example.com username=foo -- -- @@ -121,14 +162,20 @@ test_expect_success 'credential_reject calls all helpers' ' check reject useless "verbatim one two" <<-\EOF + protocol=http + host=example.com username=foo password=bar -- -- useless: erase + useless: protocol=http + useless: host=example.com useless: username=foo useless: password=bar verbatim: erase + verbatim: protocol=http + verbatim: host=example.com verbatim: username=foo verbatim: password=bar EOF @@ -136,33 +183,49 @@ test_expect_success 'usernames can be preserved' ' check fill "verbatim \"\" three" <<-\EOF + protocol=http + host=example.com username=one -- + protocol=http + host=example.com username=one password=three -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com verbatim: username=one EOF ' test_expect_success 'usernames can be overridden' ' check fill "verbatim two three" <<-\EOF + protocol=http + host=example.com username=one -- + protocol=http + host=example.com username=two password=three -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com verbatim: username=one EOF ' test_expect_success 'do not bother completing already-full credential' ' check fill "verbatim three four" <<-\EOF + protocol=http + host=example.com username=one password=two -- + protocol=http + host=example.com username=one password=two -- @@ -174,23 +237,31 @@ # askpass helper is run, we know the internal getpass is working. test_expect_success 'empty helper list falls back to internal getpass' ' check fill <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=askpass-username password=askpass-password -- - askpass: Username: - askpass: Password: + askpass: Username for '\''http://example.com'\'': + askpass: Password for '\''http://[email protected]'\'': EOF ' test_expect_success 'internal getpass does not ask for known username' ' check fill <<-\EOF + protocol=http + host=example.com username=foo -- + protocol=http + host=example.com username=foo password=askpass-password -- - askpass: Password: + askpass: Password for '\''http://[email protected]'\'': EOF ' @@ -202,7 +273,11 @@ test_expect_success 'respect configured credentials' ' test_config credential.helper "$HELPER" && check fill <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=foo password=bar -- @@ -419,35 +494,85 @@ test_expect_success 'helpers can abort the process' ' test_must_fail git \ - -c credential.helper="!f() { echo quit=1; }; f" \ + -c credential.helper=quit \ -c credential.helper="verbatim foo bar" \ - credential fill >stdout && - test_must_be_empty stdout + credential fill >stdout 2>stderr <<-\EOF && + protocol=http + host=example.com + EOF + test_must_be_empty stdout && + cat >expect <<-\EOF && + quit: get + quit: protocol=http + quit: host=example.com + fatal: credential helper '\''quit'\'' told us to quit + EOF + test_i18ncmp expect stderr ' test_expect_success 'empty helper spec resets helper list' ' test_config credential.helper "verbatim file file" && check fill "" "verbatim cmdline cmdline" <<-\EOF + protocol=http + host=example.com -- + protocol=http + host=example.com username=cmdline password=cmdline -- verbatim: get + verbatim: protocol=http + verbatim: host=example.com EOF ' -test_expect_success 'url parser ignores embedded newlines' ' - check fill <<-EOF +test_expect_success 'url parser rejects embedded newlines' ' + test_must_fail git credential fill 2>stderr <<-\EOF && url=https://one.example.com?%0ahost=two.example.com/ + EOF + cat >expect <<-\EOF && + warning: url contains a newline in its host component: https://one.example.com?%0ahost=two.example.com/ + fatal: credential url cannot be parsed: https://one.example.com?%0ahost=two.example.com/ + EOF + test_i18ncmp expect stderr +' + +test_expect_success 'host-less URLs are parsed as empty host' ' + check fill "verbatim foo bar" <<-\EOF + url=cert:///path/to/cert.pem -- - username=askpass-username - password=askpass-password + protocol=cert + host= + path=path/to/cert.pem + username=foo + password=bar -- - warning: url contains a newline in its host component: https://one.example.com?%0ahost=two.example.com/ - warning: skipping credential lookup for url: https://one.example.com?%0ahost=two.example.com/ - askpass: Username: - askpass: Password: + verbatim: get + verbatim: protocol=cert + verbatim: host= + verbatim: path=path/to/cert.pem + EOF +' + +test_expect_success 'credential system refuses to work with missing host' ' + test_must_fail git credential fill 2>stderr <<-\EOF && + protocol=http + EOF + cat >expect <<-\EOF && + fatal: refusing to work with credential missing host field + EOF + test_i18ncmp expect stderr +' + +test_expect_success 'credential system refuses to work with missing protocol' ' + test_must_fail git credential fill 2>stderr <<-\EOF && + host=example.com + EOF + cat >expect <<-\EOF && + fatal: refusing to work with credential missing protocol field EOF + test_i18ncmp expect stderr ' test_done diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/t/t5550-http-fetch-dumb.sh new/git-2.26.2/t/t5550-http-fetch-dumb.sh --- old/git-2.26.1/t/t5550-http-fetch-dumb.sh 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/t/t5550-http-fetch-dumb.sh 2020-04-20 17:52:30.000000000 +0200 @@ -321,11 +321,17 @@ ' test_expect_success 'remote-http complains cleanly about malformed urls' ' - # do not actually issue "list" or other commands, as we do not - # want to rely on what curl would actually do with such a broken - # URL. This is just about making sure we do not segfault during - # initialization. - test_must_fail git remote-http http::/example.com/repo.git + test_must_fail git remote-http http::/example.com/repo.git 2>stderr && + test_i18ngrep "url has no scheme" stderr +' + +# NEEDSWORK: Writing commands to git-remote-curl can race against the latter +# erroring out, producing SIGPIPE. Remove "ok=sigpipe" once transport-helper has +# learned to handle early remote helper failures more cleanly. +test_expect_success 'remote-http complains cleanly about empty scheme' ' + test_must_fail ok=sigpipe git ls-remote \ + http::${HTTPD_URL#http}/dumb/repo.git 2>stderr && + test_i18ngrep "url has no scheme" stderr ' test_expect_success 'redirects can be forbidden/allowed' ' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/t/t7416-submodule-dash-url.sh new/git-2.26.2/t/t7416-submodule-dash-url.sh --- old/git-2.26.1/t/t7416-submodule-dash-url.sh 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/t/t7416-submodule-dash-url.sh 2020-04-20 17:52:30.000000000 +0200 @@ -60,6 +60,116 @@ test_i18ngrep ! "unknown option" err ' +test_expect_success 'fsck rejects missing URL scheme' ' + git checkout --orphan missing-scheme && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = http::one.example.com/foo.git + EOF + git add .gitmodules && + test_tick && + git commit -m "gitmodules with missing URL scheme" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects relative URL resolving to missing scheme' ' + git checkout --orphan relative-missing-scheme && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = "..\\../.\\../:one.example.com/foo.git" + EOF + git add .gitmodules && + test_tick && + git commit -m "gitmodules with relative URL that strips off scheme" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects empty URL scheme' ' + git checkout --orphan empty-scheme && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = http::://one.example.com/foo.git + EOF + git add .gitmodules && + test_tick && + git commit -m "gitmodules with empty URL scheme" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects relative URL resolving to empty scheme' ' + git checkout --orphan relative-empty-scheme && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = ../../../:://one.example.com/foo.git + EOF + git add .gitmodules && + test_tick && + git commit -m "relative gitmodules URL resolving to empty scheme" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects empty hostname' ' + git checkout --orphan empty-host && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = http:///one.example.com/foo.git + EOF + git add .gitmodules && + test_tick && + git commit -m "gitmodules with extra slashes" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects relative url that produced empty hostname' ' + git checkout --orphan messy-relative && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = ../../..//one.example.com/foo.git + EOF + git add .gitmodules && + test_tick && + git commit -m "gitmodules abusing relative_path" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck permits embedded newline with unrecognized scheme' ' + git checkout --orphan newscheme && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = "data://acjbkd%0akajfdickajkd" + EOF + git add .gitmodules && + git commit -m "gitmodules with unrecognized scheme" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && + git push dst HEAD +' + test_expect_success 'fsck rejects embedded newline in url' ' # create an orphan branch to avoid existing .gitmodules objects git checkout --orphan newline && @@ -72,6 +182,21 @@ test_when_finished "rm -rf dst" && git init --bare dst && git -C dst config transfer.fsckObjects true && + test_must_fail git push dst HEAD 2>err && + grep gitmodulesUrl err +' + +test_expect_success 'fsck rejects embedded newline in relative url' ' + git checkout --orphan relative-newline && + cat >.gitmodules <<-\EOF && + [submodule "foo"] + url = "./%0ahost=two.example.com/foo.git" + EOF + git add .gitmodules && + git commit -m "relative url with newline" && + test_when_finished "rm -rf dst" && + git init --bare dst && + git -C dst config transfer.fsckObjects true && test_must_fail git push dst HEAD 2>err && grep gitmodulesUrl err ' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/git-2.26.1/version new/git-2.26.2/version --- old/git-2.26.1/version 2020-04-14 03:51:03.000000000 +0200 +++ new/git-2.26.2/version 2020-04-20 17:52:30.000000000 +0200 @@ -1 +1 @@ -2.26.1 +2.26.2
