diff options
| author | Hai Zhang <zhanghai@google.com> | 2019-08-09 16:37:05 -0700 |
|---|---|---|
| committer | Hai Zhang <zhanghai@google.com> | 2019-08-09 16:38:52 -0700 |
| commit | fa3d2016ae389329a04a56041843595ffc11ac07 (patch) | |
| tree | bff0302275b8e5d7ed3d6b7ad33f13ea865b5518 /core/java | |
| parent | c7ccc2cd5e45c695b50844654d1c6bd53c5194a4 (diff) | |
Avoid leaking FileOutputStream in AtomicDirectory.
Bug: 138866253
Test: presubmit
Change-Id: I32adb56d207ec18de0e55664f3ac9eb575a4e3f2
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/com/android/internal/os/AtomicDirectory.java | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/core/java/com/android/internal/os/AtomicDirectory.java b/core/java/com/android/internal/os/AtomicDirectory.java index f24d12e0c3af..ebcee15587c8 100644 --- a/core/java/com/android/internal/os/AtomicDirectory.java +++ b/core/java/com/android/internal/os/AtomicDirectory.java @@ -23,6 +23,8 @@ import android.util.ArrayMap; import com.android.internal.util.Preconditions; +import libcore.io.IoUtils; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -136,10 +138,11 @@ public final class AtomicDirectory { if (file.isDirectory() || !file.getParentFile().equals(getOrCreateBaseDirectory())) { throw new IllegalArgumentException("Must be a file in " + getOrCreateBaseDirectory()); } - final FileOutputStream destination = new FileOutputStream(file); - if (mOpenFiles.put(file, destination) != null) { + if (mOpenFiles.containsKey(file)) { throw new IllegalArgumentException("Already open file" + file.getCanonicalPath()); } + final FileOutputStream destination = new FileOutputStream(file); + mOpenFiles.put(file, destination); return destination; } @@ -152,20 +155,21 @@ public final class AtomicDirectory { */ public void closeWrite(@NonNull FileOutputStream destination) { final int indexOfValue = mOpenFiles.indexOfValue(destination); - if (mOpenFiles.removeAt(indexOfValue) == null) { + if (indexOfValue < 0) { throw new IllegalArgumentException("Unknown file stream " + destination); } + mOpenFiles.removeAt(indexOfValue); FileUtils.sync(destination); - try { - destination.close(); - } catch (IOException ignored) {} + IoUtils.closeQuietly(destination); } public void failWrite(@NonNull FileOutputStream destination) { final int indexOfValue = mOpenFiles.indexOfValue(destination); - if (indexOfValue >= 0) { - mOpenFiles.removeAt(indexOfValue); + if (indexOfValue < 0) { + throw new IllegalArgumentException("Unknown file stream " + destination); } + mOpenFiles.removeAt(indexOfValue); + IoUtils.closeQuietly(destination); } /** |
