tests/functional: Also keep plain grep calls safe from newlines

This commit is contained in:
Robert Hensing 2024-07-16 01:54:12 +02:00
parent 644b97ce25
commit 41a03738d6
2 changed files with 21 additions and 3 deletions

View file

@ -351,9 +351,12 @@ checkGrepArgs() {
# #
# `!` normally doesn't work well with `set -e`, but when we wrap in a # `!` normally doesn't work well with `set -e`, but when we wrap in a
# function it *does*. # function it *does*.
#
# `command grep` lets us avoid re-checking the args by going directly to the
# executable.
grepInverse() { grepInverse() {
checkGrepArgs "$@" && \ checkGrepArgs "$@" && \
! grep "$@" ! command grep "$@"
} }
# A shorthand, `> /dev/null` is a bit noisy. # A shorthand, `> /dev/null` is a bit noisy.
@ -367,15 +370,26 @@ grepInverse() {
# the closing of the pipe, the buffering of the pipe, and the speed of # the closing of the pipe, the buffering of the pipe, and the speed of
# the producer into the pipe. But rest assured we've seen it happen in # the producer into the pipe. But rest assured we've seen it happen in
# CI reliably. # CI reliably.
#
# `command grep` lets us avoid re-checking the args by going directly to the
# executable.
grepQuiet() { grepQuiet() {
checkGrepArgs "$@" && \ checkGrepArgs "$@" && \
grep "$@" > /dev/null command grep "$@" > /dev/null
} }
# The previous two, combined # The previous two, combined
grepQuietInverse() { grepQuietInverse() {
checkGrepArgs "$@" && \ checkGrepArgs "$@" && \
! grep "$@" > /dev/null ! command grep "$@" > /dev/null
}
# Wrap grep to remove its newline footgun; see checkGrepArgs.
# Note that we keep the checkGrepArgs calls in the other helpers, because some
# of them are negated and that would defeat this check.
grep() {
checkGrepArgs "$@" && \
command grep "$@"
} }
# Return the number of arguments # Return the number of arguments

View file

@ -113,3 +113,7 @@ unset res
# treats them as multiple queries. # treats them as multiple queries.
( echo foo; echo bar; ) | expectStderr -101 grepQuiet $'foo\nbar' \ ( echo foo; echo bar; ) | expectStderr -101 grepQuiet $'foo\nbar' \
| grepQuiet -E 'test-infra\.sh:[0-9]+: in call to grepQuiet: newline not allowed in arguments; grep would try each line individually as if connected by an OR operator' | grepQuiet -E 'test-infra\.sh:[0-9]+: in call to grepQuiet: newline not allowed in arguments; grep would try each line individually as if connected by an OR operator'
# We took the blue pill and woke up in a world where `grep` is moderately safe.
expectStderr -101 grep $'foo\nbar' \
| grepQuiet -E 'test-infra\.sh:[0-9]+: in call to grep: newline not allowed in arguments; grep would try each line individually as if connected by an OR operator'