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 <[email protected]>
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