diff options
author | Narayan Kamath <narayan@google.com> | 2017-03-22 14:28:08 +0000 |
---|---|---|
committer | Narayan Kamath <narayan@google.com> | 2017-04-03 18:12:04 +0100 |
commit | 492e9e851cadca62df84eaff1a3c1ba788492fba (patch) | |
tree | 61d47e46bb22366413a021f025b3c8e16713c55b | |
parent | 2a071d69b455399474d56cd2099e9944aec83224 (diff) |
Properly guard access to CloseGuard in finalizers.
CloseGuard instances are allocated in constructors and usually
assigned to final fields. This implies they're non-null in finalizers
except in the case where the constructor throws. We add a null check
to make sure we can continue cleaning up other state in the finalizer
(if applicable).
Also, this change decouples closeguard warnings in constructors
from other state based logic. This because the logic there is usually
duplicated with the call to close().
NOTE: This change is not a "complete" fix. Many of these finalizers
are broken in the case where <init> throws. The only objective of
this change is to make such errors more obvious.
Note that some of these classes don't have CTS tests.
Test: make, CtsMediaTestCases.
Bug: 35609098
Change-Id: I24d9e0215f80e44914dba8ab99b6312fd6ed1fc0
24 files changed, 104 insertions, 27 deletions
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index a04a7b25d3b1..f8c139feaae3 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -524,7 +524,10 @@ public class ContentProviderClient implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); @@ -579,7 +582,10 @@ public class ContentProviderClient implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 98ae132d9ed7..69cd99c41b14 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -2942,7 +2942,10 @@ public abstract class ContentResolver { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/core/java/android/hardware/SensorDirectChannel.java b/core/java/android/hardware/SensorDirectChannel.java index a65d57daa12c..2c499b01faab 100644 --- a/core/java/android/hardware/SensorDirectChannel.java +++ b/core/java/android/hardware/SensorDirectChannel.java @@ -152,7 +152,10 @@ public final class SensorDirectChannel implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java index ffd6ec32fccc..1bf2137885b2 100644 --- a/core/java/android/hardware/usb/UsbDeviceConnection.java +++ b/core/java/android/hardware/usb/UsbDeviceConnection.java @@ -332,7 +332,9 @@ public class UsbDeviceConnection { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } } finally { super.finalize(); } diff --git a/core/java/android/hardware/usb/UsbRequest.java b/core/java/android/hardware/usb/UsbRequest.java index badb344aabad..61637e964a08 100644 --- a/core/java/android/hardware/usb/UsbRequest.java +++ b/core/java/android/hardware/usb/UsbRequest.java @@ -114,7 +114,10 @@ public class UsbRequest { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java index 749cf08c8396..b3fe8a866653 100644 --- a/core/java/android/util/MemoryIntArray.java +++ b/core/java/android/util/MemoryIntArray.java @@ -158,7 +158,10 @@ public final class MemoryIntArray implements Parcelable, Closeable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + IoUtils.closeQuietly(this); } finally { super.finalize(); diff --git a/drm/java/android/drm/DrmManagerClient.java b/drm/java/android/drm/DrmManagerClient.java index 5973d3e33323..76eab4a7905a 100644 --- a/drm/java/android/drm/DrmManagerClient.java +++ b/drm/java/android/drm/DrmManagerClient.java @@ -262,7 +262,10 @@ public class DrmManagerClient implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/graphics/java/android/graphics/pdf/PdfDocument.java b/graphics/java/android/graphics/pdf/PdfDocument.java index d60343658ee3..1b8336f54637 100644 --- a/graphics/java/android/graphics/pdf/PdfDocument.java +++ b/graphics/java/android/graphics/pdf/PdfDocument.java @@ -202,7 +202,10 @@ public class PdfDocument { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + dispose(); } finally { super.finalize(); diff --git a/graphics/java/android/graphics/pdf/PdfEditor.java b/graphics/java/android/graphics/pdf/PdfEditor.java index cd1f8de6ee0f..245d76917453 100644 --- a/graphics/java/android/graphics/pdf/PdfEditor.java +++ b/graphics/java/android/graphics/pdf/PdfEditor.java @@ -270,7 +270,10 @@ public final class PdfEditor { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + if (mInput != null) { doClose(); } diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 7b7a2909b36d..b7b81aef36fd 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -230,7 +230,10 @@ public final class PdfRenderer implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + if (mInput != null) { doClose(); } @@ -444,7 +447,10 @@ public final class PdfRenderer implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + if (mNativePage != 0) { doClose(); } diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index ddfa0258ab9a..cb4e46fe945a 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -1958,7 +1958,10 @@ public class MediaScanner implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java index f7dd0b312426..a99573692664 100644 --- a/media/java/android/media/midi/MidiDevice.java +++ b/media/java/android/media/midi/MidiDevice.java @@ -103,7 +103,10 @@ public final class MidiDevice implements Closeable { @Override protected void finalize() throws Throwable { try { - mGuard.warnIfOpen(); + if (mGuard != null) { + mGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); @@ -285,7 +288,10 @@ public final class MidiDevice implements Closeable { @Override protected void finalize() throws Throwable { try { - mGuard.warnIfOpen(); + if (mGuard != null) { + mGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/media/java/android/media/midi/MidiDeviceServer.java b/media/java/android/media/midi/MidiDeviceServer.java index eaa86542ca27..51d552066bc6 100644 --- a/media/java/android/media/midi/MidiDeviceServer.java +++ b/media/java/android/media/midi/MidiDeviceServer.java @@ -429,7 +429,10 @@ public final class MidiDeviceServer implements Closeable { @Override protected void finalize() throws Throwable { try { - mGuard.warnIfOpen(); + if (mGuard != null) { + mGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/media/java/android/media/midi/MidiInputPort.java b/media/java/android/media/midi/MidiInputPort.java index 98ec7795262c..a300886ea7c1 100644 --- a/media/java/android/media/midi/MidiInputPort.java +++ b/media/java/android/media/midi/MidiInputPort.java @@ -159,7 +159,10 @@ public final class MidiInputPort extends MidiReceiver implements Closeable { @Override protected void finalize() throws Throwable { try { - mGuard.warnIfOpen(); + if (mGuard != null) { + mGuard.warnIfOpen(); + } + // not safe to make binder calls from finalize() mDeviceServer = null; close(); diff --git a/media/java/android/media/midi/MidiOutputPort.java b/media/java/android/media/midi/MidiOutputPort.java index ce0402c2465b..511f6cd51917 100644 --- a/media/java/android/media/midi/MidiOutputPort.java +++ b/media/java/android/media/midi/MidiOutputPort.java @@ -145,7 +145,10 @@ public final class MidiOutputPort extends MidiSender implements Closeable { @Override protected void finalize() throws Throwable { try { - mGuard.warnIfOpen(); + if (mGuard != null) { + mGuard.warnIfOpen(); + } + // not safe to make binder calls from finalize() mDeviceServer = null; close(); diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 56a573736c31..698c9c96fe01 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -233,7 +233,10 @@ public class MtpDatabase implements AutoCloseable { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/media/java/android/mtp/MtpDevice.java b/media/java/android/mtp/MtpDevice.java index d6958b324ca3..e8b04edb2e1b 100644 --- a/media/java/android/mtp/MtpDevice.java +++ b/media/java/android/mtp/MtpDevice.java @@ -123,7 +123,10 @@ public final class MtpDevice { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java index 6140428d353f..653a45351691 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java @@ -171,8 +171,11 @@ public final class PageContentRepository { @Override protected void finalize() throws Throwable { try { - if (mState != STATE_DESTROYED) { + if (mCloseGuard != null) { mCloseGuard.warnIfOpen(); + } + + if (mState != STATE_DESTROYED) { destroy(null); } } finally { diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java index 54400b3b8540..e172948fffd6 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java @@ -552,8 +552,11 @@ public final class PageAdapter extends Adapter<ViewHolder> { @Override protected void finalize() throws Throwable { try { - if (mState != STATE_DESTROYED) { + if (mCloseGuard != null) { mCloseGuard.warnIfOpen(); + } + + if (mState != STATE_DESTROYED) { destroy(null); } } finally { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9e275a8521fb..1415819a6aad 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -22055,7 +22055,10 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + close(); } finally { super.finalize(); diff --git a/services/core/java/com/android/server/tv/UinputBridge.java b/services/core/java/com/android/server/tv/UinputBridge.java index f91033281ef8..1a984f98051f 100644 --- a/services/core/java/com/android/server/tv/UinputBridge.java +++ b/services/core/java/com/android/server/tv/UinputBridge.java @@ -63,7 +63,7 @@ public final class UinputBridge { @Override protected void finalize() throws Throwable { try { - if (mPtr != 0) { + if (mCloseGuard != null) { mCloseGuard.warnIfOpen(); } close(mToken); diff --git a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbDeviceStateController.java b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbDeviceStateController.java index 1cb394e4d2ab..42f7955bee98 100644 --- a/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbDeviceStateController.java +++ b/tests/UsbHostExternalManagmentTest/UsbHostExternalManagmentTestApp/src/com/android/hardware/usb/externalmanagementtest/UsbDeviceStateController.java @@ -89,7 +89,10 @@ public class UsbDeviceStateController { @Override protected void finalize() throws Throwable { try { - mCloseGuard.warnIfOpen(); + if (mCloseGuard != null) { + mCloseGuard.warnIfOpen(); + } + release(); } finally { super.finalize(); diff --git a/wifi/java/android/net/wifi/aware/DiscoverySession.java b/wifi/java/android/net/wifi/aware/DiscoverySession.java index 82b3792a331c..31f01bd12baf 100644 --- a/wifi/java/android/net/wifi/aware/DiscoverySession.java +++ b/wifi/java/android/net/wifi/aware/DiscoverySession.java @@ -128,8 +128,11 @@ public class DiscoverySession { @Override protected void finalize() throws Throwable { try { - if (!mTerminated) { + if (mCloseGuard != null) { mCloseGuard.warnIfOpen(); + } + + if (!mTerminated) { destroy(); } } finally { diff --git a/wifi/java/android/net/wifi/aware/WifiAwareSession.java b/wifi/java/android/net/wifi/aware/WifiAwareSession.java index 895defb9a540..443db0c6a805 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareSession.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareSession.java @@ -82,8 +82,11 @@ public class WifiAwareSession { @Override protected void finalize() throws Throwable { try { - if (!mTerminated) { + if (mCloseGuard != null) { mCloseGuard.warnIfOpen(); + } + + if (!mTerminated) { destroy(); } } finally { |