From 02f042ddd9ddf47ef88c4f174eb19a9bee296a45 Mon Sep 17 00:00:00 2001 From: Dave Platt Date: Thu, 12 Dec 2013 15:45:49 -0800 Subject: [PATCH] Fix socket descriptor leak from Zygote to child app Due to an API change in LocalSocket, Zygote must now manually close the FileDescriptor it created when it registered a LocalServerSocket. The LocalSocket.close() routine will no longer do so. Bug: 12114500 (cherry picked from commit 70ef29b04ee4ef7d7acfec79041dbe800961195e) Change-Id: Ief23a3c99e007dc4aa6f94dfb47a1b2b6c854dad --- core/java/com/android/internal/os/ZygoteInit.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index c44afae002e31..1548f1b041a20 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -192,10 +192,16 @@ public class ZygoteInit { static void closeServerSocket() { try { if (sServerSocket != null) { + FileDescriptor fd = sServerSocket.getFileDescriptor(); sServerSocket.close(); + if (fd != null) { + Libcore.os.close(fd); + } } } catch (IOException ex) { Log.e(TAG, "Zygote: error closing sockets", ex); + } catch (libcore.io.ErrnoException ex) { + Log.e(TAG, "Zygote: error closing descriptor", ex); } sServerSocket = null;