diff mbox series

[1/2] t5411: remove file after use to prevent overwriting

Message ID 20210118133011.15331-1-worldhello.net@gmail.com (mailing list archive)
State New, archived
Headers show
Series [1/2] t5411: remove file after use to prevent overwriting | expand

Commit Message

Jiang Xin Jan. 18, 2021, 1:30 p.m. UTC
From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

SZEDER reported that t5411 failed in Travis CI's s390x environment a
couple of times, and could be reproduced with '--stress' test on this
specific environment.  The test failure messages might look like this:

    + test_cmp expect actual
    --- expect      2021-01-17 21:55:23.430750004 +0000
    +++ actual      2021-01-17 21:55:23.430750004 +0000
    @@ -1 +1 @@
    -<COMMIT-A> refs/heads/main
    +<COMMIT-A> refs/heads/maifatal: the remote end hung up unexpectedly
    error: last command exited with $?=1
    not ok 86 - proc-receive: not support push options (builtin protocol)

The file 'actual' is filtered from the file 'out' which contains result
of 'git show-ref' command.  Due to the error messages from other process
is written into the file 'out' accidentally, t5411 failed.  SZEDER finds
the root cause of this issue:

 - 'git push' is executed with its standard output and error redirected
   to the file 'out'.

 - 'git push' executes 'git receive-pack' internally, which inherits
   the open file descriptors, so its output and error goes into that
   same 'out' file.

 - 'git push' ends without waiting for the close of 'git-receive-pack'
   for some cases, and the file 'out' is reused for test of
   'git show-ref' afterwards.

 - A mixture of the output of 'git show-ref' abd 'git receive-pack'
   leads to this issue.

To resolve this issue, we can remove the file 'out' after use.  The
long-running 'git receive-pack' will not redirect its output to the new
created 'out' file which has a different file descriptor.

Reported-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 t/t5411/test-0000-standard-git-push.sh         |  4 ++++
 .../test-0001-standard-git-push--porcelain.sh  |  4 ++++
 t/t5411/test-0002-pre-receive-declined.sh      |  2 ++
 ...est-0003-pre-receive-declined--porcelain.sh |  2 ++
 t/t5411/test-0011-no-hook-error.sh             |  4 ++++
 t/t5411/test-0012-no-hook-error--porcelain.sh  |  4 ++++
 t/t5411/test-0013-bad-protocol.sh              | 18 ++++++++++++++++++
 t/t5411/test-0014-bad-protocol--porcelain.sh   | 18 ++++++++++++++++++
 t/t5411/test-0020-report-ng.sh                 |  4 ++++
 t/t5411/test-0021-report-ng--porcelain.sh      |  4 ++++
 t/t5411/test-0022-report-unexpect-ref.sh       |  2 ++
 ...test-0023-report-unexpect-ref--porcelain.sh |  2 ++
 t/t5411/test-0024-report-unknown-ref.sh        |  2 ++
 .../test-0025-report-unknown-ref--porcelain.sh |  2 ++
 t/t5411/test-0026-push-options.sh              |  2 ++
 t/t5411/test-0027-push-options--porcelain.sh   |  2 ++
 t/t5411/test-0032-report-with-options.sh       |  2 ++
 ...test-0033-report-with-options--porcelain.sh |  2 ++
 t/t5411/test-0038-report-mixed-refs.sh         |  2 ++
 .../test-0039-report-mixed-refs--porcelain.sh  |  2 ++
 20 files changed, 84 insertions(+)

Comments

Johannes Sixt Jan. 18, 2021, 6:21 p.m. UTC | #1
Am 18.01.21 um 14:30 schrieb Jiang Xin:
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> 
> SZEDER reported that t5411 failed in Travis CI's s390x environment a
> couple of times, and could be reproduced with '--stress' test on this
> specific environment.  The test failure messages might look like this:
> 
>     + test_cmp expect actual
>     --- expect      2021-01-17 21:55:23.430750004 +0000
>     +++ actual      2021-01-17 21:55:23.430750004 +0000
>     @@ -1 +1 @@
>     -<COMMIT-A> refs/heads/main
>     +<COMMIT-A> refs/heads/maifatal: the remote end hung up unexpectedly
>     error: last command exited with $?=1
>     not ok 86 - proc-receive: not support push options (builtin protocol)
> 
> The file 'actual' is filtered from the file 'out' which contains result
> of 'git show-ref' command.  Due to the error messages from other process
> is written into the file 'out' accidentally, t5411 failed.  SZEDER finds
> the root cause of this issue:
> 
>  - 'git push' is executed with its standard output and error redirected
>    to the file 'out'.
> 
>  - 'git push' executes 'git receive-pack' internally, which inherits
>    the open file descriptors, so its output and error goes into that
>    same 'out' file.
> 
>  - 'git push' ends without waiting for the close of 'git-receive-pack'
>    for some cases, and the file 'out' is reused for test of
>    'git show-ref' afterwards.
> 
>  - A mixture of the output of 'git show-ref' abd 'git receive-pack'
>    leads to this issue.
> 
> To resolve this issue, we can remove the file 'out' after use.  The
> long-running 'git receive-pack' will not redirect its output to the new
> created 'out' file which has a different file descriptor.

On Windows, removing an open file is not possible and this...

> diff --git a/t/t5411/test-0000-standard-git-push.sh b/t/t5411/test-0000-standard-git-push.sh
> index 47b058af7e..694d8e8dc2 100644
> --- a/t/t5411/test-0000-standard-git-push.sh
> +++ b/t/t5411/test-0000-standard-git-push.sh
> @@ -40,6 +40,8 @@ test_expect_success "git-push --atomic ($PROTOCOL)" '
>  		-e "/^To / { p; }" \
>  		-e "/^ ! / { p; }" \
>  		<out >actual &&
> +	# Prevent accidential changes by the internal "receive-pack" process.
> +	rm out &&

... would fail.

That said, your next patch removes a lot of uses of the 'out' file
against which this 'rm out' should protect. Doesn't this make this patch
unnecessary?

>  	cat >expect <<-EOF &&
>  	To <URL/of/upstream.git>
>  	 ! [rejected] main -> main (non-fast-forward)

-- Hannes
Jiang Xin Jan. 19, 2021, 12:48 a.m. UTC | #2
Johannes Sixt <j6t@kdbg.org> 于2021年1月19日周二 上午2:21写道:
>
> Am 18.01.21 um 14:30 schrieb Jiang Xin:
> > From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >
> > SZEDER reported that t5411 failed in Travis CI's s390x environment a
> > couple of times, and could be reproduced with '--stress' test on this
> > specific environment.  The test failure messages might look like this:
> >
> >     + test_cmp expect actual
> >     --- expect      2021-01-17 21:55:23.430750004 +0000
> >     +++ actual      2021-01-17 21:55:23.430750004 +0000
> >     @@ -1 +1 @@
> >     -<COMMIT-A> refs/heads/main
> >     +<COMMIT-A> refs/heads/maifatal: the remote end hung up unexpectedly
> >     error: last command exited with $?=1
> >     not ok 86 - proc-receive: not support push options (builtin protocol)
> >
> > The file 'actual' is filtered from the file 'out' which contains result
> > of 'git show-ref' command.  Due to the error messages from other process
> > is written into the file 'out' accidentally, t5411 failed.  SZEDER finds
> > the root cause of this issue:
> >
> >  - 'git push' is executed with its standard output and error redirected
> >    to the file 'out'.
> >
> >  - 'git push' executes 'git receive-pack' internally, which inherits
> >    the open file descriptors, so its output and error goes into that
> >    same 'out' file.
> >
> >  - 'git push' ends without waiting for the close of 'git-receive-pack'
> >    for some cases, and the file 'out' is reused for test of
> >    'git show-ref' afterwards.
> >
> >  - A mixture of the output of 'git show-ref' abd 'git receive-pack'
> >    leads to this issue.
> >
> > To resolve this issue, we can remove the file 'out' after use.  The
> > long-running 'git receive-pack' will not redirect its output to the new
> > created 'out' file which has a different file descriptor.
>
> On Windows, removing an open file is not possible and this...
>
> > diff --git a/t/t5411/test-0000-standard-git-push.sh b/t/t5411/test-0000-standard-git-push.sh
> > index 47b058af7e..694d8e8dc2 100644
> > --- a/t/t5411/test-0000-standard-git-push.sh
> > +++ b/t/t5411/test-0000-standard-git-push.sh
> > @@ -40,6 +40,8 @@ test_expect_success "git-push --atomic ($PROTOCOL)" '
> >               -e "/^To / { p; }" \
> >               -e "/^ ! / { p; }" \
> >               <out >actual &&
> > +     # Prevent accidential changes by the internal "receive-pack" process.
> > +     rm out &&
>
> ... would fail.

Thank you for reminding. It seems that the only way is to use a
different output file name.

> That said, your next patch removes a lot of uses of the 'out' file
> against which this 'rm out' should protect. Doesn't this make this patch
> unnecessary?

The other test cases also write to the same "out" file, so the issue
still needs to be fixed.

--
Jiang Xin
diff mbox series

Patch

diff --git a/t/t5411/test-0000-standard-git-push.sh b/t/t5411/test-0000-standard-git-push.sh
index 47b058af7e..694d8e8dc2 100644
--- a/t/t5411/test-0000-standard-git-push.sh
+++ b/t/t5411/test-0000-standard-git-push.sh
@@ -40,6 +40,8 @@  test_expect_success "git-push --atomic ($PROTOCOL)" '
 		-e "/^To / { p; }" \
 		-e "/^ ! / { p; }" \
 		<out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	To <URL/of/upstream.git>
 	 ! [rejected] main -> main (non-fast-forward)
@@ -67,6 +69,8 @@  test_expect_success "non-fast-forward git-push ($PROTOCOL)" '
 		$B:refs/heads/next \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/next
diff --git a/t/t5411/test-0001-standard-git-push--porcelain.sh b/t/t5411/test-0001-standard-git-push--porcelain.sh
index bbead12bbb..6cf0bc7034 100644
--- a/t/t5411/test-0001-standard-git-push--porcelain.sh
+++ b/t/t5411/test-0001-standard-git-push--porcelain.sh
@@ -42,6 +42,8 @@  test_expect_success "git-push --atomic ($PROTOCOL/porcelain)" '
 		-e "/^To / { p; }" \
 		-e "/^! / { p; }" \
 		<out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	To <URL/of/upstream.git>
 	!    refs/heads/main:refs/heads/main    [rejected] (non-fast-forward)
@@ -69,6 +71,8 @@  test_expect_success "non-fast-forward git-push ($PROTOCOL/porcelain)" '
 		$B:refs/heads/next \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/next
diff --git a/t/t5411/test-0002-pre-receive-declined.sh b/t/t5411/test-0002-pre-receive-declined.sh
index e7d113a158..61c3ee1b7f 100644
--- a/t/t5411/test-0002-pre-receive-declined.sh
+++ b/t/t5411/test-0002-pre-receive-declined.sh
@@ -14,6 +14,8 @@  test_expect_success "git-push is declined ($PROTOCOL)" '
 		HEAD:refs/heads/next \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	To <URL/of/upstream.git>
 	 ! [remote rejected] <COMMIT-B> -> main (pre-receive hook declined)
diff --git a/t/t5411/test-0003-pre-receive-declined--porcelain.sh b/t/t5411/test-0003-pre-receive-declined--porcelain.sh
index cc0cca6a47..0a9cc2d44a 100644
--- a/t/t5411/test-0003-pre-receive-declined--porcelain.sh
+++ b/t/t5411/test-0003-pre-receive-declined--porcelain.sh
@@ -14,6 +14,8 @@  test_expect_success "git-push is declined ($PROTOCOL/porcelain)" '
 		HEAD:refs/heads/next \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	To <URL/of/upstream.git>
 	!    <COMMIT-B>:refs/heads/main    [remote rejected] (pre-receive hook declined)
diff --git a/t/t5411/test-0011-no-hook-error.sh b/t/t5411/test-0011-no-hook-error.sh
index c50830982f..fd2bd20b76 100644
--- a/t/t5411/test-0011-no-hook-error.sh
+++ b/t/t5411/test-0011-no-hook-error.sh
@@ -7,6 +7,8 @@  test_expect_success "proc-receive: no hook, fail to push special ref ($PROTOCOL)
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
@@ -43,6 +45,8 @@  test_expect_success "proc-receive: no hook, all failed for atomic push ($PROTOCO
 		HEAD:next \
 		HEAD:refs/for/main/topic >out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
diff --git a/t/t5411/test-0012-no-hook-error--porcelain.sh b/t/t5411/test-0012-no-hook-error--porcelain.sh
index 14ea433481..025a9c7186 100644
--- a/t/t5411/test-0012-no-hook-error--porcelain.sh
+++ b/t/t5411/test-0012-no-hook-error--porcelain.sh
@@ -7,6 +7,8 @@  test_expect_success "proc-receive: no hook, fail to push special ref ($PROTOCOL/
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
@@ -44,6 +46,8 @@  test_expect_success "proc-receive: no hook, all failed for atomic push ($PROTOCO
 		HEAD:next \
 		HEAD:refs/for/main/topic >out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
diff --git a/t/t5411/test-0013-bad-protocol.sh b/t/t5411/test-0013-bad-protocol.sh
index b9be12be77..d20a4e6681 100644
--- a/t/t5411/test-0013-bad-protocol.sh
+++ b/t/t5411/test-0013-bad-protocol.sh
@@ -13,6 +13,8 @@  test_expect_success "proc-receive: bad protocol (unknown version, $PROTOCOL)" '
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	# Check status report for git-push
 	sed -n \
@@ -67,6 +69,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTO
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-version option" out &&
 	grep "remote: error: fail to negotiate version with proc-receive hook" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -101,6 +105,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROT
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-write-version option" out &&
 	grep "remote: error: fail to negotiate version with proc-receive hook" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -134,6 +140,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROT
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-commands option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -169,6 +177,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-push-options option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -202,6 +212,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTO
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-write-report option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -226,6 +238,8 @@  test_expect_success "proc-receive: bad protocol (no report, $PROTOCOL)" '
 		HEAD:refs/heads/next \
 		HEAD:refs/for/main/topic >out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
@@ -272,6 +286,8 @@  test_expect_success "proc-receive: bad protocol (no ref, $PROTOCOL)" '
 		HEAD:refs/for/main/topic\
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
@@ -308,6 +324,8 @@  test_expect_success "proc-receive: bad protocol (unknown status, $PROTOCOL)" '
 			HEAD:refs/for/main/topic \
 			>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0014-bad-protocol--porcelain.sh b/t/t5411/test-0014-bad-protocol--porcelain.sh
index fdb4569109..a286030f3e 100644
--- a/t/t5411/test-0014-bad-protocol--porcelain.sh
+++ b/t/t5411/test-0014-bad-protocol--porcelain.sh
@@ -13,6 +13,8 @@  test_expect_success "proc-receive: bad protocol (unknown version, $PROTOCOL/porc
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	# Check status report for git-push
 	sed -n \
@@ -67,6 +69,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-version, $PROTO
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-version option" out &&
 	grep "remote: error: fail to negotiate version with proc-receive hook" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -101,6 +105,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-write-version, $PROT
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-write-version option" out &&
 	grep "remote: error: fail to negotiate version with proc-receive hook" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -134,6 +140,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-commands, $PROT
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-commands option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -169,6 +177,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-read-push-options, $
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-read-push-options option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -202,6 +212,8 @@  test_expect_success "proc-receive: bad protocol (hook --die-write-report, $PROTO
 	EOF
 	test_cmp expect actual &&
 	grep "remote: fatal: die with the --die-write-report option" out &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 
 	git -C "$upstream" show-ref >out &&
 	make_user_friendly_and_stable_output <out >actual &&
@@ -226,6 +238,8 @@  test_expect_success "proc-receive: bad protocol (no report, $PROTOCOL/porcelain)
 		HEAD:refs/heads/next \
 		HEAD:refs/for/main/topic >out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
@@ -272,6 +286,8 @@  test_expect_success "proc-receive: bad protocol (no ref, $PROTOCOL/porcelain)" '
 		HEAD:refs/for/main/topic\
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
@@ -309,6 +325,8 @@  test_expect_success "proc-receive: bad protocol (unknown status, $PROTOCOL/porce
 			HEAD:refs/for/main/topic \
 			>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0020-report-ng.sh b/t/t5411/test-0020-report-ng.sh
index 5a9e0daf2d..9f71da9fb6 100644
--- a/t/t5411/test-0020-report-ng.sh
+++ b/t/t5411/test-0020-report-ng.sh
@@ -14,6 +14,8 @@  test_expect_success "proc-receive: fail to update (ng, no message, $PROTOCOL)" '
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
@@ -48,6 +50,8 @@  test_expect_success "proc-receive: fail to update (ng, with message, $PROTOCOL)"
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0021-report-ng--porcelain.sh b/t/t5411/test-0021-report-ng--porcelain.sh
index 93475a83cf..96065e3537 100644
--- a/t/t5411/test-0021-report-ng--porcelain.sh
+++ b/t/t5411/test-0021-report-ng--porcelain.sh
@@ -14,6 +14,8 @@  test_expect_success "proc-receive: fail to update (ng, no message, $PROTOCOL/por
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
@@ -49,6 +51,8 @@  test_expect_success "proc-receive: fail to update (ng, with message, $PROTOCOL/p
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0022-report-unexpect-ref.sh b/t/t5411/test-0022-report-unexpect-ref.sh
index f8be8a0ba1..624dda7acc 100644
--- a/t/t5411/test-0022-report-unexpect-ref.sh
+++ b/t/t5411/test-0022-report-unexpect-ref.sh
@@ -15,6 +15,8 @@  test_expect_success "proc-receive: report unexpected ref ($PROTOCOL)" '
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
diff --git a/t/t5411/test-0023-report-unexpect-ref--porcelain.sh b/t/t5411/test-0023-report-unexpect-ref--porcelain.sh
index 778150fa03..dcb804afc8 100644
--- a/t/t5411/test-0023-report-unexpect-ref--porcelain.sh
+++ b/t/t5411/test-0023-report-unexpect-ref--porcelain.sh
@@ -15,6 +15,8 @@  test_expect_success "proc-receive: report unexpected ref ($PROTOCOL/porcelain)"
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
diff --git a/t/t5411/test-0024-report-unknown-ref.sh b/t/t5411/test-0024-report-unknown-ref.sh
index d4e74e4681..af65355862 100644
--- a/t/t5411/test-0024-report-unknown-ref.sh
+++ b/t/t5411/test-0024-report-unknown-ref.sh
@@ -14,6 +14,8 @@  test_expect_success "proc-receive: report unknown reference ($PROTOCOL)" '
 		HEAD:refs/for/a/b/c/my/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic
diff --git a/t/t5411/test-0025-report-unknown-ref--porcelain.sh b/t/t5411/test-0025-report-unknown-ref--porcelain.sh
index 039e8b6163..c336ec0e98 100644
--- a/t/t5411/test-0025-report-unknown-ref--porcelain.sh
+++ b/t/t5411/test-0025-report-unknown-ref--porcelain.sh
@@ -14,6 +14,8 @@  test_expect_success "proc-receive: report unknown reference ($PROTOCOL/porcelain
 		HEAD:refs/for/a/b/c/my/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/a/b/c/my/topic
diff --git a/t/t5411/test-0026-push-options.sh b/t/t5411/test-0026-push-options.sh
index e88edb16a4..46b1064fe6 100644
--- a/t/t5411/test-0026-push-options.sh
+++ b/t/t5411/test-0026-push-options.sh
@@ -18,6 +18,8 @@  test_expect_success "proc-receive: not support push options ($PROTOCOL)" '
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	test_i18ngrep "fatal: the receiving end does not support push options" \
 		actual &&
 	git -C "$upstream" show-ref >out &&
diff --git a/t/t5411/test-0027-push-options--porcelain.sh b/t/t5411/test-0027-push-options--porcelain.sh
index 3a6561b5ea..79a49a638e 100644
--- a/t/t5411/test-0027-push-options--porcelain.sh
+++ b/t/t5411/test-0027-push-options--porcelain.sh
@@ -19,6 +19,8 @@  test_expect_success "proc-receive: not support push options ($PROTOCOL/porcelain
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	test_i18ngrep "fatal: the receiving end does not support push options" \
 		actual &&
 	git -C "$upstream" show-ref >out &&
diff --git a/t/t5411/test-0032-report-with-options.sh b/t/t5411/test-0032-report-with-options.sh
index a0faf5c7ff..4d058cc6ff 100644
--- a/t/t5411/test-0032-report-with-options.sh
+++ b/t/t5411/test-0032-report-with-options.sh
@@ -15,6 +15,8 @@  test_expect_success "proc-receive: report option without matching ok ($PROTOCOL)
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0033-report-with-options--porcelain.sh b/t/t5411/test-0033-report-with-options--porcelain.sh
index 32ae26bcfb..8ab908a6b0 100644
--- a/t/t5411/test-0033-report-with-options--porcelain.sh
+++ b/t/t5411/test-0033-report-with-options--porcelain.sh
@@ -15,6 +15,8 @@  test_expect_success "proc-receive: report option without matching ok ($PROTOCOL/
 		HEAD:refs/for/main/topic \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/for/main/topic
diff --git a/t/t5411/test-0038-report-mixed-refs.sh b/t/t5411/test-0038-report-mixed-refs.sh
index 0d071ebaa6..264a5d5c6d 100644
--- a/t/t5411/test-0038-report-mixed-refs.sh
+++ b/t/t5411/test-0038-report-mixed-refs.sh
@@ -26,6 +26,8 @@  test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL)" '
 		HEAD:refs/for/next/topic3 \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
diff --git a/t/t5411/test-0039-report-mixed-refs--porcelain.sh b/t/t5411/test-0039-report-mixed-refs--porcelain.sh
index d8409912fd..1e9c06d2b7 100644
--- a/t/t5411/test-0039-report-mixed-refs--porcelain.sh
+++ b/t/t5411/test-0039-report-mixed-refs--porcelain.sh
@@ -26,6 +26,8 @@  test_expect_success "proc-receive: report update of mixed refs ($PROTOCOL/porcel
 		HEAD:refs/for/next/topic3 \
 		>out 2>&1 &&
 	make_user_friendly_and_stable_output <out >actual &&
+	# Prevent accidential changes by the internal "receive-pack" process.
+	rm out &&
 	cat >expect <<-EOF &&
 	remote: # pre-receive hook
 	remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main