mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-07-18 12:58:21 +08:00
[Robustness] nvm_alias: explicitly succeed when the alias file is unreadable
The sed/awk pipeline exits with awk's status, so an existing-but-unreadable alias file produces empty output with status 0 - but only by accident, alongside sed's read error on stderr. Make that contract explicit: a nonzero status here would flip `nvm_ensure_default_set` from "default is already set" to recreating it, silently overwriting a write-only default alias.
This commit is contained in:
@@ -1362,6 +1362,14 @@ nvm_alias() {
|
||||
return 2
|
||||
fi
|
||||
|
||||
if [ ! -r "${NVM_ALIAS_PATH}" ]; then
|
||||
# an existing-but-unreadable alias file yields empty output with a success
|
||||
# status - a nonzero status here would make `nvm_ensure_default_set`
|
||||
# overwrite an existing default alias it merely could not read
|
||||
nvm_err "Alias file is not readable: ${NVM_ALIAS_PATH}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
command sed 's/#.*//; s/[[:space:]]*$//' "${NVM_ALIAS_PATH}" | command awk 'NF'
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
#!/bin/sh
|
||||
|
||||
die () { echo "$@" ; cleanup ; exit 1; }
|
||||
|
||||
cleanup() {
|
||||
chmod 644 ../../../alias/test-edge-unreadable 2>/dev/null
|
||||
rm -f ../../../alias/test-edge-unreadable
|
||||
}
|
||||
|
||||
export NVM_DIR="$(cd ../../.. && pwd)"
|
||||
|
||||
: nvm.sh
|
||||
\. "${NVM_DIR}/nvm.sh"
|
||||
|
||||
# Create an alias file that exists but can not be read
|
||||
echo 'v0.0.1' > ../../../alias/test-edge-unreadable
|
||||
chmod 000 ../../../alias/test-edge-unreadable
|
||||
|
||||
# root (and some containers) can read mode-000 files; nothing to assert there
|
||||
if [ -r ../../../alias/test-edge-unreadable ]; then
|
||||
cleanup
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# like the sed/awk pipeline this replaced: empty output, success status, so
|
||||
# that `nvm_ensure_default_set` does not overwrite an unreadable default alias
|
||||
OUTPUT="$(nvm_alias test-edge-unreadable 2>/dev/null)"
|
||||
EXIT_CODE=$?
|
||||
[ "${EXIT_CODE}" = '0' ] || die "expected exit code 0 for unreadable alias file, got ${EXIT_CODE}"
|
||||
[ -z "${OUTPUT}" ] || die "expected empty output for unreadable alias file, got >${OUTPUT}<"
|
||||
|
||||
STDERR="$(nvm_alias test-edge-unreadable 2>&1 >/dev/null)"
|
||||
case "${STDERR}" in
|
||||
*'not readable'*) ;;
|
||||
*) die "expected a not-readable warning on stderr, got >${STDERR}<" ;;
|
||||
esac
|
||||
|
||||
cleanup
|
||||
Reference in New Issue
Block a user