Fix FD leak in the Zygote.

Issues with LocalSocketImpl.close meant that a FD that was supposed to
be closed wasn't.  This CL switches to using Os.close to ensure that the
FD is closed properly.

Bug: 130309968
Bug: 130235718
Test: atest android.security.cts.FileDescriptorTest#testCLOEXEC
Test: Tested for file existance after Os.close call
Change-Id: I80fb3b378f651e71bc1ae9aab8636935a2ff6356
Merged-In: I80fb3b378f651e71bc1ae9aab8636935a2ff6356
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index afdeb1b..a295bd2 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -566,7 +566,18 @@
             System.exit(-1);
         } finally {
             IoUtils.closeQuietly(sessionSocket);
-            IoUtils.closeQuietly(usapPoolSocket);
+
+            try {
+                // This socket is closed using Os.close due to an issue with the implementation of
+                // LocalSocketImp.close.  Because the raw FD is created by init and then loaded from
+                // an environment variable (as opposed to being created by the LocalSocketImpl
+                // itself) the current implementation will not actually close the underlying FD.
+                //
+                // See b/130309968 for discussion of this issue.
+                Os.close(usapPoolSocket.getFileDescriptor());
+            } catch (ErrnoException ex) {
+                Log.e("USAP", "Failed to close USAP pool socket: " + ex.getMessage());
+            }
         }
 
         try {