aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java
diff options
context:
space:
mode:
authorGravatar Philipp Wollermann <philwo@google.com>2015-10-06 11:49:28 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2015-10-06 12:26:57 +0000
commit4b40a5fccd3c9c63eea44b3eb173760dc88be743 (patch)
tree0ac0428c9e1804a66893d4f534c254f3f0747a20 /src/main/java/com/google/devtools/build/lib/sandbox/MountMap.java
parentb504305394b284e872eefdaaec8ba56bb607cebb (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.java22
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());
}
}