Merge branch 'js/apply-overwrite-rej-symlink-if-exists' into maint-2.30
Address CVE-2023-25652 by deleting any existing `.rej` symbolic links instead of following them. * js/apply-overwrite-rej-symlink-if-exists: apply --reject: overwrite existing `.rej` symlink if it exists Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
This commit is contained in:
14
apply.c
14
apply.c
@ -4558,7 +4558,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) {
|
||||||
@ -4598,7 +4598,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);
|
||||||
|
|
||||||
|
@ -125,4 +125,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
|
||||||
|
Reference in New Issue
Block a user