This is an automated email from the ASF dual-hosted git repository.

gaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git


The following commit(s) were added to refs/heads/master by this push:
     new 57a9e7b7cc Deep copy Blob in LocalBlobStore.getBlob
57a9e7b7cc is described below

commit 57a9e7b7ccb900a8d0d8808098fd5beaf75d6332
Author: Andrew Gaul <g...@apache.org>
AuthorDate: Mon Aug 1 21:19:15 2022 +0900

    Deep copy Blob in LocalBlobStore.getBlob
    
    ByteSourcePayload.openStream is not thread safe and lack of
    synchronization can throw ArrayIndexOutOfBoundsExceptions.  Instead
    deep copy the underlying Payload.  Fixes gaul/s3proxy#303.
---
 .../org/jclouds/blobstore/TransientStorageStrategy.java | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git 
a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java 
b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
index 76a66b4695..ca1b1c85d4 100644
--- 
a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
+++ 
b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java
@@ -162,7 +162,22 @@ public class TransientStorageStrategy implements 
LocalStorageStrategy {
    @Override
    public Blob getBlob(final String containerName, final String blobName) {
       Map<String, Blob> map = containerToBlobs.get(containerName);
-      return map == null ? null : map.get(blobName);
+      if (map == null) {
+         return null;
+      }
+      Blob blob = map.get(blobName);
+      if (blob == null) {
+         return null;
+      }
+
+      // Deep copy Blob to make sure ByteSourcePayload does not share Closer.
+      Payload payload = blob.getPayload();
+      MutableContentMetadata md = payload.getContentMetadata();
+      Blob newBlob = 
blobFactory.create(BlobStoreUtils.copy(blob.getMetadata()));
+      Payload newPayload = Payloads.newPayload(payload.getRawContent());
+      newBlob.setPayload(payload);
+      HttpUtils.copy(md, newPayload.getContentMetadata());
+      return newBlob;
    }
 
    @Override

Reply via email to