SharedMemory: clear file descriptor when explicitly closed.

We run the Cleaner in close, but after the fix in commit 6ca916a6, this
no longer clears the value stored in the FileDescriptor, which means
that subsequent operations on an explicitly closed SharedMemory will
operate on a bogus fd number. Clearing the FileDescriptor value in close
is sufficient, because Cleaner.clean is idempotent, and the only other
case where it executes is when the FileDescriptor is phantom reachable,
which means no one can access it to get its integer value.

Bug: http://b/138392115
Bug: http://b/138323667
Test: treehugger
Change-Id: I8bdb4c745466532a0712976416184c53fcf0dbf6
(cherry picked from commit a7641806ddf1099239632d53c629c062ff2168f4)
(cherry picked from commit 20ab1e34273aa179053f5dc93e70c0191a39e91b)
diff --git a/core/java/android/os/ b/core/java/android/os/
index 3e2ba3d..0540e36 100644
--- a/core/java/android/os/
+++ b/core/java/android/os/
@@ -259,6 +259,9 @@
             mCleaner = null;
+        // Cleaner.clean doesn't clear the value of the file descriptor.
+        mFileDescriptor.setInt$(-1);