From d5016b8ad1037e99776ab2f94f9433eaece4ac28 Mon Sep 17 00:00:00 2001 From: Ramesh Padmanabhaiah Date: Wed, 24 Jun 2026 20:04:12 -0700 Subject: [PATCH] Clarify cleanup path batch registration --- lib/bash/std/README.md | 3 ++- lib/bash/std/lib_std.sh | 23 ++++++++++++++--------- lib/bash/std/tests/lib_std.bats | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/bash/std/README.md b/lib/bash/std/README.md index d46f3dd..03d2533 100644 --- a/lib/bash/std/README.md +++ b/lib/bash/std/README.md @@ -313,7 +313,8 @@ std_register_cleanup_path "$workspace" Cleanup paths are removed with `rm -rf --` from a shared `EXIT` trap. Empty paths, root paths, and current/parent directory traversal components are -rejected before registration. +rejected before registration. When one call mixes safe and unsafe paths, safe +paths are registered, unsafe paths are rejected, and the helper returns nonzero. For custom cleanup, register a function name: diff --git a/lib/bash/std/lib_std.sh b/lib/bash/std/lib_std.sh index 4579231..96e9d87 100644 --- a/lib/bash/std/lib_std.sh +++ b/lib/bash/std/lib_std.sh @@ -1245,9 +1245,11 @@ __std_is_safe_cleanup_path__() { # # std_register_cleanup_path - Registers files or directories for removal at shell exit. # -# Paths are removed with `rm -rf --` from the shared EXIT trap. Empty paths, root -# paths, and paths containing current/parent directory traversal components are -# rejected to avoid broad accidental deletion. +# Paths are removed with `rm -rf --` from the shared EXIT trap. Empty paths, +# root paths, and paths containing current/parent directory traversal components +# are rejected to avoid broad accidental deletion. Safe paths in the same call +# are still registered, and the function returns nonzero if any path was +# rejected. # # Usage: # workspace="$(mktemp -d)" @@ -1255,6 +1257,7 @@ __std_is_safe_cleanup_path__() { # std_register_cleanup_path() { local path existing_path + local already_registered had_valid_path=0 status=0 if (($# == 0)); then log_warn "std_register_cleanup_path: No paths provided." @@ -1264,12 +1267,12 @@ std_register_cleanup_path() { for path; do if ! __std_is_safe_cleanup_path__ "$path"; then log_error "std_register_cleanup_path: refusing to register unsafe cleanup path '$path'." - return 1 + status=1 + continue fi - done - for path; do - local already_registered=0 + had_valid_path=1 + already_registered=0 for existing_path in "${__std_cleanup_paths[@]}"; do if [[ "$existing_path" == "$path" ]]; then already_registered=1 @@ -1279,8 +1282,10 @@ std_register_cleanup_path() { ((already_registered)) || __std_cleanup_paths+=("$path") done - __std_install_cleanup_dispatcher__ - return 0 + if ((had_valid_path)); then + __std_install_cleanup_dispatcher__ + fi + return "$status" } ######################################################## TEMP FILES #################################################### diff --git a/lib/bash/std/tests/lib_std.bats b/lib/bash/std/tests/lib_std.bats index ec77f3b..b2ac7b1 100644 --- a/lib/bash/std/tests/lib_std.bats +++ b/lib/bash/std/tests/lib_std.bats @@ -1218,6 +1218,24 @@ EOF [[ "$(cat "$stderr_file")" == *"std_register_cleanup_path: refusing to register unsafe cleanup path"* ]] } +@test "cleanup path registration keeps valid paths from mixed batches" { + local target_file="$TEST_TMPDIR/cleanup-valid-file.txt" + local target_dir="$TEST_TMPDIR/cleanup-valid-dir" + local stderr_file="$TEST_TMPDIR/cleanup-mixed.err" + local rc=0 + + printf 'sample\n' > "$target_file" + mkdir -p "$target_dir" + + std_register_cleanup_path "$target_file" "/" "$target_dir" 2>"$stderr_file" || rc=$? + + [ "$rc" -eq 1 ] + [[ "$(cat "$stderr_file")" == *"std_register_cleanup_path: refusing to register unsafe cleanup path '/'"* ]] + [[ " ${__std_cleanup_paths[*]} " == *" $target_file "* ]] + [[ " ${__std_cleanup_paths[*]} " == *" $target_dir "* ]] + [[ " ${__std_cleanup_paths[*]} " != *" / "* ]] +} + @test "std_make_temp_file creates a file under TMPDIR and cleans it up" { local script="$TEST_TMPDIR/temp-file.sh" local temp_root="$TEST_TMPDIR/temp-root"