diff --git a/tools/build/lib/acceptance.sh b/tools/build/lib/acceptance.sh index 01155d8..3b4eda7 100644 --- a/tools/build/lib/acceptance.sh +++ b/tools/build/lib/acceptance.sh @@ -1005,15 +1005,22 @@ run_admin_login_acceptance() { # # Проверяются КОМАНДЫ: объяснение, почему такой строки здесь больше нет, # обязано называть её по имени, поэтому текст вне ```-блоков не считается. - local env_doc + local env_doc fenced_code while IFS= read -r env_doc; do [ -n "$env_doc" ] || continue - if fenced_code_of "$env_doc" \ - | grep -qE '(^|[;&|[:space:]])(source|\.)[[:space:]]+[^[:space:]]*(/etc/hy2xs/|hy2xs\.env|bootstrap-admin\.secret)'; then + # fenced_code_of сначала обязан дочитать документ целиком. `grep -q` в + # pipeline под pipefail закрывал канал после первого совпадения и мог + # превратить найденную запрещённую команду в ложный PASS через SIGPIPE 141. + fenced_code="$(fenced_code_of "$env_doc")" \ + || fail "acceptance: не удалось прочитать fenced code из $env_doc" + if grep -qE \ + '(^|[;&|[:space:]])(source|\.)[[:space:]]+[^[:space:]]*(/etc/hy2xs/|hy2xs\.env|bootstrap-admin\.secret)' \ + <<<"$fenced_code"; then fail "acceptance: $env_doc снова предлагает исполнить env-файл шеллом (source/.)" fi - if fenced_code_of "$env_doc" \ - | grep -qE 'eval[[:space:]]+[^|]*(hy2xs\.env|bootstrap-admin\.secret)'; then + if grep -qE \ + 'eval[[:space:]]+[^|]*(hy2xs\.env|bootstrap-admin\.secret)' \ + <<<"$fenced_code"; then fail "acceptance: $env_doc снова предлагает eval над env-файлом" fi done <