nukeReferences: fix for store paths with special characters (like '+' or '.')

This introduces extra escaping for $NIX_STORE that gets interpolated
into a PCRE. The escaping is performed using a standard Perl function
"quotemeta" (see "perldoc -f quotemeta" for reference). The same value
is also used in sed regex which uses POSIX basic regular expressions
instead of PCRE, so it needs fewer characters to be escaped. It should
not cause much problem to not change sed invocation, but I replace it
with equivalent Perl expression (actually the behavior is changed to not
output a newline character after the matched output).
This commit is contained in:
Dmitry Kalinkin 2019-05-03 12:56:44 -04:00
parent 56b560942c
commit fdada4a45f
No known key found for this signature in database
GPG Key ID: 5157B3EC8B2CA333

View File

@ -7,7 +7,7 @@ cat > $out/bin/nuke-refs <<EOF
excludes="" excludes=""
while getopts e: o; do while getopts e: o; do
case "\$o" in case "\$o" in
e) storeId=\$(echo "\$OPTARG" | sed -n "s|^$NIX_STORE/\\([a-z0-9]\{32\}\\)-.*|\1|p") e) storeId=\$(echo "\$OPTARG" | $perl/bin/perl -ne "print \"\\\$1\" if m|^\Q$NIX_STORE\E/([a-z0-9]{32})-.*|")
if [ -z "\$storeId" ]; then if [ -z "\$storeId" ]; then
echo "-e argument must be a Nix store path" echo "-e argument must be a Nix store path"
exit 1 exit 1
@ -20,7 +20,7 @@ shift \$((\$OPTIND-1))
for i in "\$@"; do for i in "\$@"; do
if test ! -L "\$i" -a -f "\$i"; then if test ! -L "\$i" -a -f "\$i"; then
cat "\$i" | $perl/bin/perl -pe "s|$NIX_STORE/\$excludes[a-z0-9]{32}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" > "\$i.tmp" cat "\$i" | $perl/bin/perl -pe "s|\Q$NIX_STORE\E/\$excludes[a-z0-9]{32}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" > "\$i.tmp"
if test -x "\$i"; then chmod +x "\$i.tmp"; fi if test -x "\$i"; then chmod +x "\$i.tmp"; fi
mv "\$i.tmp" "\$i" mv "\$i.tmp" "\$i"
fi fi