From: Peter Maydell Date: Tue, 17 Mar 2026 09:48:05 +0000 (+0000) Subject: scripts/qemu-guest-agent/fsfreeze-hook: Avoid use of PIPESTATUS X-Git-Tag: v11.0.0-rc2~12^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65b9f4791c24b09814ae51135e8dad283faed348;p=thirdparty%2Fqemu.git scripts/qemu-guest-agent/fsfreeze-hook: Avoid use of PIPESTATUS PIPESTATUS is a bash-specific construct, and this script is supposed to be POSIX shell. We only use it in one place, to capture the exit status of a command whose output we are piping to 'logger'. Replace the PIPESTATUS usage with the trick described in https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675 which uses a command-group to capture the status of the first process in the pipeline. Cc: qemu-stable@nongnu.org Fixes: 85978dfb6b1c133 ("qemu-ga: Optimize freeze-hook script logic of logging error") Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3339 Signed-off-by: Peter Maydell Reviewed-by: Kostiantyn Kostiuk Link: https://lore.kernel.org/qemu-devel/20260317094806.1944053-3-peter.maydell@linaro.org Signed-off-by: Kostiantyn Kostiuk --- diff --git a/scripts/qemu-guest-agent/fsfreeze-hook b/scripts/qemu-guest-agent/fsfreeze-hook index 6e2d7588afe..21eb5c51457 100755 --- a/scripts/qemu-guest-agent/fsfreeze-hook +++ b/scripts/qemu-guest-agent/fsfreeze-hook @@ -47,8 +47,23 @@ for file in "$FSFREEZE_D"/* ; do "$file" "$@" >>"$LOGFILE" 2>&1 STATUS=$? else - "$file" "$@" 2>&1 | logger -t qemu-ga-freeze-hook - STATUS=${PIPESTATUS[0]} + # We want to pipe the output of $file through 'logger' and also + # capture its exit status. Since we are a POSIX script we can't + # use PIPESTATUS, so instead this is a trick borrowed from + # https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another/70675#70675 + # which uses command-groups and redirection to get the exit status. + # This is equivalent to + # "$file" "$@" 2>&1 | logger -t qemu-ga-freeze-hook + # plus setting the exit status of the pipe to the exit + # status of the first command rather than the last one. + { { { { + "$file" "$@" 2>&1 3>&- 4>&- + echo $? >&3 + } | logger -t qemu-ga-freeze-hook >&4 + } 3>&1 + } | { read -r xs ; exit "$xs"; } + } 4>&1 + STATUS=$? fi if [ "$STATUS" -ne 0 ]; then