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