diff options
author | 2016-10-24 20:27:58 +0000 | |
---|---|---|
committer | 2016-10-25 20:16:29 +0000 | |
commit | 11730a017e6f79bbd07a6ed29d6d05dc1c87d345 (patch) | |
tree | 261bf7341b3d29340708638479dc6a4ecbffcefc /src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java | |
parent | b3610d54c87938e89e81d83810c0d16a41115a11 (diff) |
Accept valid relative symlinks in TreeArtifacts.
--
MOS_MIGRATED_REVID=137072310
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java index b523c92e37..0f86ad1934 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java @@ -190,8 +190,33 @@ class TreeArtifactValue implements SkyValue { explodeDirectory(treeArtifact, pathToExplode.getChild(subpath.getBaseName()), valuesBuilder); } else if (subpath.isSymbolicLink()) { - throw new IOException( - "A TreeArtifact may not contain a symlink, found " + subpath); + PathFragment linkTarget = subpath.readSymbolicLinkUnchecked(); + if (linkTarget.isAbsolute()) { + String errorMessage = String.format( + "A TreeArtifact may not contain absolute symlinks, found %s pointing to %s.", + subpath, + linkTarget); + throw new IOException(errorMessage); + } + + // We visit each path segment of the link target to catch any path traversal outside of the + // TreeArtifact root directory. For example, for TreeArtifact a/b/c, it is possible to have + // a symlink, a/b/c/sym_link that points to ../outside_dir/../c/link_target. Although this + // symlink points to a file under the TreeArtifact, the link target traverses outside of the + // TreeArtifact into a/b/outside_dir. + PathFragment intermediatePath = canonicalSubpathFragment.getParentDirectory(); + for (String pathSegment : linkTarget.getSegments()) { + intermediatePath = intermediatePath.getRelative(pathSegment).normalize(); + if (intermediatePath.containsUplevelReferences()) { + String errorMessage = String.format( + "A TreeArtifact may not contain relative symlinks whose target paths traverse " + + "outside of the TreeArtifact, found %s pointing to %s.", + subpath, + linkTarget); + throw new IOException(errorMessage); + } + } + valuesBuilder.add(canonicalSubpathFragment); } else if (subpath.isFile()) { valuesBuilder.add(canonicalSubpathFragment); } else { |