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
|
return 2
|
||||||
fi
|
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'
|
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