Skip to content

Commit

Permalink
Fixes SCons#2801. Undefined variable value yields '.' as node and may…
Browse files Browse the repository at this point in the history
… cause rermoving all files in tree.
  • Loading branch information
bdbaddog committed Mar 22, 2021
1 parent a25f3ec commit 4152e16
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
4 changes: 4 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER
"Multiple ways to build the same target were specified for:". Now mingw will disable
creating the symlinks (and adding version string to ) dlls. It sets SHLIBNOVERSIONSYMLINKS,
IMPLIBNOVERSIONSYMLINKS and LDMODULENOVERSIONSYMLINKS to True.
- Fix Issue #2801 - Handle calling Clean('$XYZ','$ABC') when either env['XYZ'] or env['ABC']
is undefined as that would yield either argument as '.'. This will lead to cleaning the wrong
(or all) files potentially when you request the wrong (or any target).


From Daniel Moody:
- Update CacheDir to use uuid for tmpfile uniqueness instead of pid.
Expand Down
18 changes: 15 additions & 3 deletions SCons/Environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,15 @@

import copy
import os
import sys
import re
import shlex
import sys
from collections import UserDict

import SCons.Action
import SCons.Builder
import SCons.Debug
from SCons.Debug import logInstanceCreation
import SCons.Defaults
from SCons.Errors import UserError, BuildError
import SCons.Memoize
import SCons.Node
import SCons.Node.Alias
Expand All @@ -54,6 +52,8 @@
import SCons.Subst
import SCons.Tool
import SCons.Warnings
from SCons.Debug import logInstanceCreation
from SCons.Errors import UserError, BuildError
from SCons.Util import (
AppendPath,
CLVar,
Expand All @@ -74,6 +74,7 @@
uniquer_hashables,
)


class _Null:
pass

Expand Down Expand Up @@ -2000,6 +2001,17 @@ def CacheDir(self, path):

def Clean(self, targets, files):
global CleanTargets

# Check for anything which evaluates to empty string, which would yield cleaning '.'
targets_strings = [(t, self.subst(t)) for t in flatten(targets) if is_String(t) and ('$' in t or t == '')]
files_strings = [(t, self.subst(t)) for t in flatten(files) if is_String(t) and ('$' in t or t == '')]
if any([s=='' for t,s in targets_strings]):
raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join(
["%s='%s'"%(str(t),s) for (t, s) in targets_strings]))
if any([s=='' for t,s in files_strings]):
raise UserError("Targets specified to Clean() include on which evaluates to an empty string: [%s]" % ",".join(
["%s='%s'"%(str(t),s) for (t, s) in files_strings]))

tlist = self.arg2nodes(targets, self.fs.Entry)
flist = self.arg2nodes(files, self.fs.Entry)
for t in tlist:
Expand Down

0 comments on commit 4152e16

Please sign in to comment.