RFR: 8233115: Protect ExecuteWithLog from running with redirection without a subshell
Erik Joelsson
erikj at openjdk.org
Thu Sep 4 16:56:48 UTC 2025
On Thu, 4 Sep 2025 14:03:41 GMT, Magnus Ihse Bursie <ihse at openjdk.org> wrote:
> When calling ExecuteWithLog with a redirection (using > or, possibly, <), the entire command needs to be executed in a subshell, that is, inside a pair of parentheses. This is the callers obligation to ensure, but we have proven multiple times that this is hard to keep in mind, and we got several cases of race conditions due to missing this.
>
> This PR changes the implementation of ExecuteWithLog so it checks if the command line contains redirection, and automatically add the subshell parentheses in that case. The alternative would have been to always execute in a subshell, but that would have been very expensive on Windows.
make/common/MakeBase.gmk line 306:
> 304: $(call MakeDir, $(dir $(strip $1)) $(MAKESUPPORT_OUTPUTDIR)/failure-logs) \
> 305: $(call WriteFile, $2, $(strip $1).cmdline) \
> 306: ( $(RM) $(strip $1).log && $(if $(call is_redirect, $2),$(LEFT_PAREN) )$(strip $2)$(if $(call is_redirect, $2), $(RIGHT_PAREN)) > >($(TEE) -a $(strip $1).log) 2> >($(TEE) -a $(strip $1).log >&2) || \
Consider breaking these lines.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27096#discussion_r2322796527
More information about the build-dev
mailing list