diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2016-08-24 14:08:00 +0200 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2016-08-24 14:08:00 +0200 |
commit | 20d3f83f27946f9654c48f096b2f671f7d5e3662 (patch) | |
tree | 3b308f240728f45eef010e97bf476f50d1c2105e /org.eclipse.jgit.http.apache | |
parent | b8260b5e790c839f0071dec8067aa3c8d04022eb (diff) | |
download | jgit-20d3f83f27946f9654c48f096b2f671f7d5e3662.tar.gz jgit-20d3f83f27946f9654c48f096b2f671f7d5e3662.zip |
Fix HttpClientConnection leaking temporary buffer files
HttpClientConnection uses a TemporaryBufferEntity which uses
TemporaryBuffer.LocalFile to buffer an HttpEntity. It was leaking
temporary files if the buffered entities were larger than 1MB since it
failed to destroy the TemporaryBuffer.LocalFile.
Bug: 500079
Change-Id: Ib963e04efc252bdd0420a5c69b1a19181e9e6169
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit.http.apache')
2 files changed, 33 insertions, 12 deletions
diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java index a0eeef89fc..2d9d17a890 100644 --- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java +++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/HttpClientConnection.java @@ -226,17 +226,25 @@ public class HttpClientConnection implements HttpConnection { } private void execute() throws IOException, ClientProtocolException { - if (resp == null) - if (entity != null) { - if (req instanceof HttpEntityEnclosingRequest) { - HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req; - eReq.setEntity(entity); - } - resp = getClient().execute(req); - entity.getBuffer().close(); - entity = null; - } else - resp = getClient().execute(req); + if (resp != null) { + return; + } + + if (entity == null) { + resp = getClient().execute(req); + return; + } + + try { + if (req instanceof HttpEntityEnclosingRequest) { + HttpEntityEnclosingRequest eReq = (HttpEntityEnclosingRequest) req; + eReq.setEntity(entity); + } + resp = getClient().execute(req); + } finally { + entity.close(); + entity = null; + } } public Map<String, List<String>> getHeaderFields() { diff --git a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java index 1ff168e237..377e5ca572 100644 --- a/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java +++ b/org.eclipse.jgit.http.apache/src/org/eclipse/jgit/transport/http/apache/TemporaryBufferEntity.java @@ -55,7 +55,8 @@ import org.eclipse.jgit.util.TemporaryBuffer; * * @since 3.3 */ -public class TemporaryBufferEntity extends AbstractHttpEntity { +public class TemporaryBufferEntity extends AbstractHttpEntity + implements AutoCloseable { private TemporaryBuffer buffer; private Integer contentLength; @@ -106,4 +107,16 @@ public class TemporaryBufferEntity extends AbstractHttpEntity { public void setContentLength(int contentLength) { this.contentLength = new Integer(contentLength); } + + /** + * Close destroys the associated buffer used to buffer the entity + * + * @since 4.5 + */ + @Override + public void close() { + if (buffer != null) { + buffer.destroy(); + } + } } |