Repository: jclouds Updated Branches: refs/heads/master 08e78c979 -> 4874a1eb1
JCLOUDS-1137: Handle TOCTOU during blobMetadata A similar issue exists when getting a blob payload when a caller simultaneously removes the blob. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/4874a1eb Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/4874a1eb Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/4874a1eb Branch: refs/heads/master Commit: 4874a1eb185870eef88731080ae8cf9ceebc3be2 Parents: 08e78c9 Author: Andrew Gaul <[email protected]> Authored: Mon Jul 11 21:51:52 2016 -0700 Committer: Andrew Gaul <[email protected]> Committed: Mon Jul 11 22:02:15 2016 -0700 ---------------------------------------------------------------------- .../internal/FilesystemStorageStrategyImpl.java | 3 +++ .../org/jclouds/blobstore/config/LocalBlobStore.java | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/4874a1eb/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java ---------------------------------------------------------------------- diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java index ff16954..3de142e 100644 --- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java +++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java @@ -32,6 +32,7 @@ import static org.jclouds.filesystem.util.Utils.setPublic; import static org.jclouds.util.Closeables2.closeQuietly; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; @@ -389,6 +390,8 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy { .contentLength(byteSource.size()) .contentMD5(byteSource.hash(Hashing.md5()).asBytes()); } + } catch (FileNotFoundException fnfe) { + return null; } catch (IOException e) { throw Throwables.propagate(e); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/4874a1eb/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java index 65d39ba..631f182 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java @@ -245,18 +245,21 @@ public final class LocalBlobStore implements BlobStore { return storageStrategy.blobExists(containerName, key); } }); - SortedSet<StorageMetadata> contents = newTreeSet(transform(blobBelongingToContainer, - new Function<String, StorageMetadata>() { + SortedSet<StorageMetadata> contents = newTreeSet(FluentIterable.from(blobBelongingToContainer) + .transform(new Function<String, StorageMetadata>() { + @Override public StorageMetadata apply(String key) { Blob oldBlob = loadBlob(containerName, key); - checkState(oldBlob != null, "blob " + key + " is not present although it was in the list of " - + containerName); + if (oldBlob == null) { + return null; + } checkState(oldBlob.getMetadata() != null, "blob " + containerName + "/" + key + " has no metadata"); MutableBlobMetadata md = BlobStoreUtils.copy(oldBlob.getMetadata()); md.setSize(oldBlob.getMetadata().getSize()); return md; } - })); + }) + .filter(Predicates.<StorageMetadata>notNull())); String marker = null; if (options != null) {
