Sync with 2.36.6

* maint-2.36: (30 commits)
  Git 2.36.6
  Git 2.35.8
  Git 2.34.8
  Git 2.33.8
  Git 2.32.7
  Git 2.31.8
  tests: avoid using `test_i18ncmp`
  Git 2.30.9
  gettext: avoid using gettext if the locale dir is not present
  apply --reject: overwrite existing `.rej` symlink if it exists
  http.c: clear the 'finished' member once we are done with it
  clone.c: avoid "exceeds maximum object size" error with GCC v12.x
  range-diff: use ssize_t for parsed "len" in read_patches()
  range-diff: handle unterminated lines in read_patches()
  range-diff: drop useless "offset" variable from read_patches()
  t5604: GETTEXT_POISON fix, conclusion
  t5604: GETTEXT_POISON fix, part 1
  t5619: GETTEXT_POISON fix
  t0003: GETTEXT_POISON fix, conclusion
  t0003: GETTEXT_POISON fix, part 1
  t0033: GETTEXT_POISON fix
  ...
This commit is contained in:
Johannes Schindelin 2023-03-11 21:18:55 +01:00
commit 1df551ce5c
17 changed files with 189 additions and 28 deletions

View File

@ -232,12 +232,12 @@ jobs:
- jobname: linux-gcc - jobname: linux-gcc
cc: gcc cc: gcc
cc_package: gcc-8 cc_package: gcc-8
pool: ubuntu-latest pool: ubuntu-20.04
- jobname: linux-TEST-vars - jobname: linux-TEST-vars
cc: gcc cc: gcc
os: ubuntu os: ubuntu
cc_package: gcc-8 cc_package: gcc-8
pool: ubuntu-latest pool: ubuntu-20.04
- jobname: osx-clang - jobname: osx-clang
cc: clang cc: clang
pool: macos-latest pool: macos-latest

View File

@ -0,0 +1,43 @@
Git v2.30.9 Release Notes
=========================
This release addresses the security issues CVE-2023-25652,
CVE-2023-25815, and CVE-2023-29007.
Fixes since v2.30.8
-------------------
* CVE-2023-25652:
By feeding specially crafted input to `git apply --reject`, a
path outside the working tree can be overwritten with partially
controlled contents (corresponding to the rejected hunk(s) from
the given patch).
* CVE-2023-25815:
When Git is compiled with runtime prefix support and runs without
translated messages, it still used the gettext machinery to
display messages, which subsequently potentially looked for
translated messages in unexpected places. This allowed for
malicious placement of crafted messages.
* CVE-2023-29007:
When renaming or deleting a section from a configuration file,
certain malicious configuration values may be misinterpreted as
the beginning of a new configuration section, leading to arbitrary
configuration injection.
Credit for finding CVE-2023-25652 goes to Ry0taK, and the fix was
developed by Taylor Blau, Junio C Hamano and Johannes Schindelin,
with the help of Linus Torvalds.
Credit for finding CVE-2023-25815 goes to Maxime Escourbiac and
Yassine BENGANA of Michelin, and the fix was developed by Johannes
Schindelin.
Credit for finding CVE-2023-29007 goes to André Baptista and Vítor Pinho
of Ethiack, and the fix was developed by Taylor Blau, and Johannes
Schindelin, with help from Jeff King, and Patrick Steinhardt.

View File

@ -0,0 +1,6 @@
Git v2.31.8 Release Notes
=========================
This release merges the fixes that appear in v2.30.9 to address the
security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007;
see the release notes for that version for details.

View File

@ -0,0 +1,7 @@
Git v2.32.7 Release Notes
=========================
This release merges the fixes that appear in v2.30.9 and v2.31.8 to
address the security issues CVE-2023-25652, CVE-2023-25815, and
CVE-2023-29007; see the release notes for these versions for
details.

View File

@ -0,0 +1,7 @@
Git v2.33.8 Release Notes
=========================
This release merges the fixes that appear in v2.30.9, v2.31.8 and
v2.32.7 to address the security issues CVE-2023-25652,
CVE-2023-25815, and CVE-2023-29007; see the release notes for these
versions for details.

View File

@ -0,0 +1,7 @@
Git v2.34.8 Release Notes
=========================
This release merges the fixes that appear in v2.30.9, v2.31.8,
v2.32.7 and v2.33.8 to address the security issues CVE-2023-25652,
CVE-2023-25815, and CVE-2023-29007; see the release notes for these
versions for details.

View File

@ -0,0 +1,7 @@
Git v2.35.8 Release Notes
=========================
This release merges the fixes that appear in v2.30.9, v2.31.8,
v2.32.7, v2.33.8 and v2.34.8 to address the security issues
CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release
notes for these versions for details.

View File

@ -0,0 +1,7 @@
Git v2.36.6 Release Notes
=========================
This release merges the fixes that appear in v2.30.9, v2.31.8,
v2.32.7, v2.33.8, v2.34.8 and v2.35.8 to address the security issues
CVE-2023-25652, CVS-2023-25815, and CVE-2023-29007; see the release
notes for these versions for details.

View File

@ -1324,6 +1324,7 @@ BASIC_CFLAGS += -DSHA1DC_FORCE_ALIGNED_ACCESS
endif endif
ifneq ($(filter leak,$(SANITIZERS)),) ifneq ($(filter leak,$(SANITIZERS)),)
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
BASIC_CFLAGS += -O0
SANITIZE_LEAK = YesCompiledWithIt SANITIZE_LEAK = YesCompiledWithIt
endif endif
ifneq ($(filter address,$(SANITIZERS)),) ifneq ($(filter address,$(SANITIZERS)),)

14
apply.c
View File

@ -4566,7 +4566,7 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
FILE *rej; FILE *rej;
char namebuf[PATH_MAX]; char namebuf[PATH_MAX];
struct fragment *frag; struct fragment *frag;
int cnt = 0; int fd, cnt = 0;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) { for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) {
@ -4606,7 +4606,17 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
memcpy(namebuf, patch->new_name, cnt); memcpy(namebuf, patch->new_name, cnt);
memcpy(namebuf + cnt, ".rej", 5); memcpy(namebuf + cnt, ".rej", 5);
rej = fopen(namebuf, "w"); fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0) {
if (errno != EEXIST)
return error_errno(_("cannot open %s"), namebuf);
if (unlink(namebuf))
return error_errno(_("cannot unlink '%s'"), namebuf);
fd = open(namebuf, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0)
return error_errno(_("cannot open %s"), namebuf);
}
rej = fdopen(fd, "w");
if (!rej) if (!rej)
return error_errno(_("cannot open %s"), namebuf); return error_errno(_("cannot open %s"), namebuf);

View File

@ -5,17 +5,17 @@
. ${0%/*}/lib.sh . ${0%/*}/lib.sh
P4WHENCE=https://cdist2.perforce.com/perforce/r$LINUX_P4_VERSION P4WHENCE=https://cdist2.perforce.com/perforce/r21.2
LFSWHENCE=https://github.com/github/git-lfs/releases/download/v$LINUX_GIT_LFS_VERSION LFSWHENCE=https://github.com/github/git-lfs/releases/download/v$LINUX_GIT_LFS_VERSION
UBUNTU_COMMON_PKGS="make libssl-dev libcurl4-openssl-dev libexpat-dev UBUNTU_COMMON_PKGS="make libssl-dev libcurl4-openssl-dev libexpat-dev
tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl
libemail-valid-perl libio-socket-ssl-perl libnet-smtp-ssl-perl" libemail-valid-perl libio-socket-ssl-perl libnet-smtp-ssl-perl"
case "$runs_on_pool" in case "$runs_on_pool" in
ubuntu-latest) ubuntu-*)
sudo apt-get -q update sudo apt-get -q update
sudo apt-get -q -y install language-pack-is libsvn-perl apache2 \ sudo apt-get -q -y install language-pack-is libsvn-perl apache2 \
$UBUNTU_COMMON_PKGS $CC_PACKAGE $UBUNTU_COMMON_PKGS $CC_PACKAGE $PYTHON_PACKAGE
mkdir --parents "$P4_PATH" mkdir --parents "$P4_PATH"
pushd "$P4_PATH" pushd "$P4_PATH"
wget --quiet "$P4WHENCE/bin.linux26x86_64/p4d" wget --quiet "$P4WHENCE/bin.linux26x86_64/p4d"
@ -40,7 +40,7 @@ macos-latest)
mkdir -p $HOME/bin mkdir -p $HOME/bin
( (
cd $HOME/bin cd $HOME/bin
wget -q "https://cdist2.perforce.com/perforce/r21.2/bin.macosx1015x86_64/helix-core-server.tgz" && wget -q "$P4WHENCE/bin.macosx1015x86_64/helix-core-server.tgz" &&
tar -xf helix-core-server.tgz && tar -xf helix-core-server.tgz &&
sudo xattr -d com.apple.quarantine p4 p4d 2>/dev/null || true sudo xattr -d com.apple.quarantine p4 p4d 2>/dev/null || true
) )
@ -83,11 +83,9 @@ esac
if type p4d >/dev/null 2>&1 && type p4 >/dev/null 2>&1 if type p4d >/dev/null 2>&1 && type p4 >/dev/null 2>&1
then then
echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)" echo "$(tput setaf 6)Perforce Server Version$(tput sgr0)"
p4d -V | grep Rev. p4d -V
echo "$(tput setaf 6)Perforce Client Version$(tput sgr0)" echo "$(tput setaf 6)Perforce Client Version$(tput sgr0)"
p4 -V | grep Rev. p4 -V
else
echo >&2 "WARNING: perforce wasn't installed, see above for clues why"
fi fi
if type git-lfs >/dev/null 2>&1 if type git-lfs >/dev/null 2>&1
then then

View File

@ -226,18 +226,18 @@ export GIT_TEST_CLONE_2GB=true
export SKIP_DASHED_BUILT_INS=YesPlease export SKIP_DASHED_BUILT_INS=YesPlease
case "$runs_on_pool" in case "$runs_on_pool" in
ubuntu-latest) ubuntu-*)
if test "$jobname" = "linux-gcc-default" if test "$jobname" = "linux-gcc-default"
then then
break break
fi fi
PYTHON_PACKAGE=python2
if [ "$jobname" = linux-gcc ] if [ "$jobname" = linux-gcc ]
then then
MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python3" PYTHON_PACKAGE=python3
else
MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python2"
fi fi
MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/$PYTHON_PACKAGE"
export GIT_TEST_HTTPD=true export GIT_TEST_HTTPD=true
@ -246,7 +246,6 @@ ubuntu-latest)
# were recorded in the Homebrew database upon creating the OS X # were recorded in the Homebrew database upon creating the OS X
# image. # image.
# Keep that in mind when you encounter a broken OS X build! # Keep that in mind when you encounter a broken OS X build!
export LINUX_P4_VERSION="16.2"
export LINUX_GIT_LFS_VERSION="1.5.2" export LINUX_GIT_LFS_VERSION="1.5.2"
P4_PATH="$HOME/custom/p4" P4_PATH="$HOME/custom/p4"

View File

@ -3438,9 +3438,10 @@ void git_config_set_multivar(const char *key, const char *value,
flags); flags);
} }
static int section_name_match (const char *buf, const char *name) static size_t section_name_match (const char *buf, const char *name)
{ {
int i = 0, j = 0, dot = 0; size_t i = 0, j = 0;
int dot = 0;
if (buf[i] != '[') if (buf[i] != '[')
return 0; return 0;
for (i = 1; buf[i] && buf[i] != ']'; i++) { for (i = 1; buf[i] && buf[i] != ']'; i++) {
@ -3493,6 +3494,8 @@ static int section_name_is_ok(const char *name)
return 1; return 1;
} }
#define GIT_CONFIG_MAX_LINE_LEN (512 * 1024)
/* if new_name == NULL, the section is removed instead */ /* if new_name == NULL, the section is removed instead */
static int git_config_copy_or_rename_section_in_file(const char *config_filename, static int git_config_copy_or_rename_section_in_file(const char *config_filename,
const char *old_name, const char *old_name,
@ -3502,11 +3505,12 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
char *filename_buf = NULL; char *filename_buf = NULL;
struct lock_file lock = LOCK_INIT; struct lock_file lock = LOCK_INIT;
int out_fd; int out_fd;
char buf[1024]; struct strbuf buf = STRBUF_INIT;
FILE *config_file = NULL; FILE *config_file = NULL;
struct stat st; struct stat st;
struct strbuf copystr = STRBUF_INIT; struct strbuf copystr = STRBUF_INIT;
struct config_store_data store; struct config_store_data store;
uint32_t line_nr = 0;
memset(&store, 0, sizeof(store)); memset(&store, 0, sizeof(store));
@ -3543,16 +3547,25 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
goto out; goto out;
} }
while (fgets(buf, sizeof(buf), config_file)) { while (!strbuf_getwholeline(&buf, config_file, '\n')) {
unsigned i; size_t i, length;
int length;
int is_section = 0; int is_section = 0;
char *output = buf; char *output = buf.buf;
for (i = 0; buf[i] && isspace(buf[i]); i++)
line_nr++;
if (buf.len >= GIT_CONFIG_MAX_LINE_LEN) {
ret = error(_("refusing to work with overly long line "
"in '%s' on line %"PRIuMAX),
config_filename, (uintmax_t)line_nr);
goto out;
}
for (i = 0; buf.buf[i] && isspace(buf.buf[i]); i++)
; /* do nothing */ ; /* do nothing */
if (buf[i] == '[') { if (buf.buf[i] == '[') {
/* it's a section */ /* it's a section */
int offset; size_t offset;
is_section = 1; is_section = 1;
/* /*
@ -3569,7 +3582,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
strbuf_reset(&copystr); strbuf_reset(&copystr);
} }
offset = section_name_match(&buf[i], old_name); offset = section_name_match(&buf.buf[i], old_name);
if (offset > 0) { if (offset > 0) {
ret++; ret++;
if (!new_name) { if (!new_name) {
@ -3644,6 +3657,7 @@ out:
out_no_rollback: out_no_rollback:
free(filename_buf); free(filename_buf);
config_store_data_clear(&store); config_store_data_clear(&store);
strbuf_release(&buf);
return ret; return ret;
} }

View File

@ -102,6 +102,8 @@ static void init_gettext_charset(const char *domain)
setlocale(LC_CTYPE, "C"); setlocale(LC_CTYPE, "C");
} }
int git_gettext_enabled = 0;
void git_setup_gettext(void) void git_setup_gettext(void)
{ {
const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT); const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT);
@ -121,6 +123,8 @@ void git_setup_gettext(void)
init_gettext_charset("git"); init_gettext_charset("git");
textdomain("git"); textdomain("git");
git_gettext_enabled = 1;
free(p); free(p);
} }

View File

@ -29,9 +29,11 @@
#define FORMAT_PRESERVING(n) __attribute__((format_arg(n))) #define FORMAT_PRESERVING(n) __attribute__((format_arg(n)))
#ifndef NO_GETTEXT #ifndef NO_GETTEXT
extern int git_gettext_enabled;
void git_setup_gettext(void); void git_setup_gettext(void);
int gettext_width(const char *s); int gettext_width(const char *s);
#else #else
#define git_gettext_enabled (0)
static inline void git_setup_gettext(void) static inline void git_setup_gettext(void)
{ {
} }
@ -45,12 +47,16 @@ static inline FORMAT_PRESERVING(1) const char *_(const char *msgid)
{ {
if (!*msgid) if (!*msgid)
return ""; return "";
if (!git_gettext_enabled)
return msgid;
return gettext(msgid); return gettext(msgid);
} }
static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2) static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2)
const char *Q_(const char *msgid, const char *plu, unsigned long n) const char *Q_(const char *msgid, const char *plu, unsigned long n)
{ {
if (!git_gettext_enabled)
return n == 1 ? msgid : plu;
return ngettext(msgid, plu, n); return ngettext(msgid, plu, n);
} }

View File

@ -617,6 +617,36 @@ test_expect_success 'renaming to bogus section is rejected' '
test_must_fail git config --rename-section branch.zwei "bogus name" test_must_fail git config --rename-section branch.zwei "bogus name"
' '
test_expect_success 'renaming a section with a long line' '
{
printf "[b]\\n" &&
printf " c = d %1024s [a] e = f\\n" " " &&
printf "[a] g = h\\n"
} >y &&
git config -f y --rename-section a xyz &&
test_must_fail git config -f y b.e
'
test_expect_success 'renaming an embedded section with a long line' '
{
printf "[b]\\n" &&
printf " c = d %1024s [a] [foo] e = f\\n" " " &&
printf "[a] g = h\\n"
} >y &&
git config -f y --rename-section a xyz &&
test_must_fail git config -f y foo.e
'
test_expect_success 'renaming a section with an overly-long line' '
{
printf "[b]\\n" &&
printf " c = d %525000s e" " " &&
printf "[a] g = h\\n"
} >y &&
test_must_fail git config -f y --rename-section a xyz 2>err &&
grep "refusing to work with overly long line in .y. on line 2" err
'
cat >> .git/config << EOF cat >> .git/config << EOF
[branch "zwei"] a = 1 [branch "vier"] [branch "zwei"] a = 1 [branch "vier"]
EOF EOF

View File

@ -126,4 +126,19 @@ test_expect_success SYMLINKS 'symlink escape when deleting file' '
test_path_is_file .git/delete-me test_path_is_file .git/delete-me
' '
test_expect_success SYMLINKS '--reject removes .rej symlink if it exists' '
test_when_finished "git reset --hard && git clean -dfx" &&
test_commit file &&
echo modified >file.t &&
git diff -- file.t >patch &&
echo modified-again >file.t &&
ln -s foo file.t.rej &&
test_must_fail git apply patch --reject 2>err &&
test_i18ngrep "Rejected hunk" err &&
test_path_is_missing foo &&
test_path_is_file file.t.rej
'
test_done test_done