diff options
author | 2015-10-06 11:49:28 +0000 | |
---|---|---|
committer | 2015-10-06 12:26:57 +0000 | |
commit | 4b40a5fccd3c9c63eea44b3eb173760dc88be743 (patch) | |
tree | 0ac0428c9e1804a66893d4f534c254f3f0747a20 /src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java | |
parent | b504305394b284e872eefdaaec8ba56bb607cebb (diff) |
sandbox: Improve MountMap to always return entries sorted by path depth and lexicographical order. This prevents certain edge cases in the sandbox, where a mounted child directory could be hidden by a later mount of a parent directory over its parent.
--
MOS_MIGRATED_REVID=104749937
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java b/src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java index 4e0ae07e41..5051d27df3 100644 --- a/src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java +++ b/src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java @@ -13,26 +13,30 @@ // limitations under the License. package com.google.devtools.build.lib.sandbox; -import com.google.common.collect.ForwardingMap; +import com.google.common.collect.ForwardingSortedMap; +import com.google.devtools.build.lib.vfs.Path; -import java.util.LinkedHashMap; import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; /** * A map that throws an exception when trying to replace a key (i.e. once a key gets a value, * any additional attempt of putting a value on the same key will throw an exception). + * + * <p>Returns entries sorted by path depth (shorter paths first) and in lexicographical order. */ -final class MountMap<K, V> extends ForwardingMap<K, V> { - final LinkedHashMap<K, V> delegate = new LinkedHashMap<>(); +final class MountMap extends ForwardingSortedMap<Path, Path> { + final TreeMap<Path, Path> delegate = new TreeMap<>(); @Override - protected Map<K, V> delegate() { + protected SortedMap<Path, Path> delegate() { return delegate; } @Override - public V put(K key, V value) { - V previousValue = get(key); + public Path put(Path key, Path value) { + Path previousValue = get(key); if (previousValue == null) { return super.put(key, value); } else if (previousValue.equals(value)) { @@ -44,8 +48,8 @@ final class MountMap<K, V> extends ForwardingMap<K, V> { } @Override - public void putAll(Map<? extends K, ? extends V> map) { - for (Entry<? extends K, ? extends V> entry : map.entrySet()) { + public void putAll(Map<? extends Path, ? extends Path> map) { + for (Entry<? extends Path, ? extends Path> entry : map.entrySet()) { put(entry.getKey(), entry.getValue()); } } |