Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Wolf2022-08-14 14:38:57 +0000
committerMatthias Sohn2022-08-14 19:33:18 +0000
commit134ee334fb22410623972fa972f60bff38b38ca8 (patch)
tree7f1a9c8192d39eb22f0aac023c71de07e499e9a1
parent1745131addfcb367b1b2ebfd167bfe155443d210 (diff)
downloadjgit-134ee334fb22410623972fa972f60bff38b38ca8.tar.gz
jgit-134ee334fb22410623972fa972f60bff38b38ca8.tar.xz
jgit-134ee334fb22410623972fa972f60bff38b38ca8.zip
WorkTreeUpdater: Fix unclosed streams
1. A TemporaryBuffer.LocalFile must be destroyed to ensure the temporary file gets deleted on disk. 2. TemporaryBuffer.openInputStream() may be used only after TemporaryBuffer.close(). 3. The caller of DirCacheCheckout.getContent() is responsible for closing the OutputStream! Change-Id: I46abb0fba27656a1026858e5783fc60d4738a45e Signed-off-by: Thomas Wolf <twolf@apache.org>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/WorkTreeUpdater.java32
1 files changed, 20 insertions, 12 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/WorkTreeUpdater.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/WorkTreeUpdater.java
index fb0b33a042..f872f9fba5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/WorkTreeUpdater.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/WorkTreeUpdater.java
@@ -554,22 +554,30 @@ public class WorkTreeUpdater implements Closeable {
if (inCore) {
return;
}
- CheckoutMetadata checkoutMetadata = new CheckoutMetadata(streamType, smudgeCommand);
+ CheckoutMetadata metadata = new CheckoutMetadata(streamType,
+ smudgeCommand);
if (safeWrite) {
- try (org.eclipse.jgit.util.TemporaryBuffer buffer =
- new org.eclipse.jgit.util.TemporaryBuffer.LocalFile(null)) {
- // Write to a buffer and copy to the file only if everything was fine.
- DirCacheCheckout.getContent(
- repo, path, checkoutMetadata, resultStreamLoader, null, buffer);
- InputStream bufIn = buffer.openInputStream();
- Files.copy(bufIn, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
+ // Write to a buffer and copy to the file only if everything was
+ // fine.
+ TemporaryBuffer buffer = new TemporaryBuffer.LocalFile(null);
+ try {
+ try (TemporaryBuffer buf = buffer) {
+ DirCacheCheckout.getContent(repo, path, metadata,
+ resultStreamLoader, null, buf);
+ }
+ try (InputStream bufIn = buffer.openInputStream()) {
+ Files.copy(bufIn, file.toPath(),
+ StandardCopyOption.REPLACE_EXISTING);
+ }
+ } finally {
+ buffer.destroy();
}
return;
}
- OutputStream outputStream = new FileOutputStream(file);
- DirCacheCheckout.getContent(
- repo, path, checkoutMetadata, resultStreamLoader, null, outputStream);
-
+ try (OutputStream outputStream = new FileOutputStream(file)) {
+ DirCacheCheckout.getContent(repo, path, metadata,
+ resultStreamLoader, null, outputStream);
+ }
}
/**

Back to the top