mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-10-11 00:00:13 +08:00
[Fix] nvm install: do not remove the caller's TMPDIR after a failed download
`nvm_install_binary` and `nvm_install_source` declared `local TMPDIR` without initializing it, and remove it with `rm -rf` on failure. dash's `local` keeps the caller's value, as does bash's when `TMPDIR` is passed as a prefix assignment (`TMPDIR=… nvm install`), so a failed download removed the caller's temp directory; on macOS, `tar` instead blocked reading the archive from the terminal.
This commit is contained in:
@@ -2775,8 +2775,12 @@ nvm_install_binary() {
|
|||||||
return 2
|
return 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# dash's `local` keeps the caller's value, and TMPDIR is usually set: it is
|
||||||
|
# later removed with `rm -rf`, so it must not start as the system temp dir
|
||||||
local TARBALL
|
local TARBALL
|
||||||
|
TARBALL=''
|
||||||
local TMPDIR
|
local TMPDIR
|
||||||
|
TMPDIR=''
|
||||||
|
|
||||||
local PROGRESS_BAR
|
local PROGRESS_BAR
|
||||||
local NODE_OR_IOJS
|
local NODE_OR_IOJS
|
||||||
@@ -3176,9 +3180,13 @@ nvm_install_source() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# see nvm_install_binary: these must not inherit TMPDIR, which is removed on failure
|
||||||
local TARBALL
|
local TARBALL
|
||||||
|
TARBALL=''
|
||||||
local TMPDIR
|
local TMPDIR
|
||||||
|
TMPDIR=''
|
||||||
local VERSION_PATH
|
local VERSION_PATH
|
||||||
|
VERSION_PATH=''
|
||||||
|
|
||||||
if [ "${NVM_NO_PROGRESS-}" = "1" ]; then
|
if [ "${NVM_NO_PROGRESS-}" = "1" ]; then
|
||||||
# --silent, --show-error, use short option as @samrocketman mentions the compatibility issue.
|
# --silent, --show-error, use short option as @samrocketman mentions the compatibility issue.
|
||||||
|
|||||||
Executable
+30
@@ -0,0 +1,30 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
WORK="${PWD}/nvm-inherited-tmpdir-work.$$"
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
command rm -rf "${WORK}"
|
||||||
|
unset -f cleanup die nvm_download_artifact
|
||||||
|
}
|
||||||
|
die () { echo "$@" ; cleanup ; exit 1; }
|
||||||
|
|
||||||
|
: nvm.sh
|
||||||
|
\. ../../../nvm.sh
|
||||||
|
|
||||||
|
nvm_download_artifact() { return 1; }
|
||||||
|
|
||||||
|
make_canary() {
|
||||||
|
command rm -rf "${WORK}/tmp"
|
||||||
|
command mkdir -p "${WORK}/tmp"
|
||||||
|
echo canary > "${WORK}/tmp/canary"
|
||||||
|
}
|
||||||
|
|
||||||
|
make_canary
|
||||||
|
TMPDIR="${WORK}/tmp" nvm_install_binary node std 8.0.0 0 < /dev/null > /dev/null 2>&1
|
||||||
|
[ -f "${WORK}/tmp/canary" ] || die 'nvm_install_binary removed the TMPDIR it inherited after a failed download'
|
||||||
|
|
||||||
|
make_canary
|
||||||
|
TMPDIR="${WORK}/tmp" nvm_install_source node std 8.0.0 < /dev/null > /dev/null 2>&1
|
||||||
|
[ -f "${WORK}/tmp/canary" ] || die 'nvm_install_source removed the TMPDIR it inherited after a failed download'
|
||||||
|
|
||||||
|
cleanup
|
||||||
Reference in New Issue
Block a user