From 80299748cc7ed5f59cb65122459b036b74150d4a Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 5 Apr 2016 14:19:53 -0700 Subject: [PATCH] MidiDevice: fix connectPorts for same Process If connectPorts() was called for a device in the same process then the connection would die when the ParcelFileDescriptor was closed. Bug: 26406775 Change-Id: Id0538452593b4761ac2a93d366ade76d2e35ce73 Signed-off-by: Phil Burk --- .../java/android/media/midi/IMidiDeviceServer.aidl | 3 ++- media/java/android/media/midi/MidiDevice.java | 14 +++++++++++--- .../java/android/media/midi/MidiDeviceServer.java | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/media/java/android/media/midi/IMidiDeviceServer.aidl b/media/java/android/media/midi/IMidiDeviceServer.aidl index c2cc2b9f93794..d5115de4a0483 100644 --- a/media/java/android/media/midi/IMidiDeviceServer.aidl +++ b/media/java/android/media/midi/IMidiDeviceServer.aidl @@ -28,7 +28,8 @@ interface IMidiDeviceServer void closeDevice(); // connects the input port pfd to the specified output port - void connectPorts(IBinder token, in ParcelFileDescriptor pfd, int outputPortNumber); + // Returns the PID of the called process. + int connectPorts(IBinder token, in ParcelFileDescriptor pfd, int outputPortNumber); MidiDeviceInfo getDeviceInfo(); void setDeviceInfo(in MidiDeviceInfo deviceInfo); diff --git a/media/java/android/media/midi/MidiDevice.java b/media/java/android/media/midi/MidiDevice.java index e1990cd6fbbb1..e4588fe3abc53 100644 --- a/media/java/android/media/midi/MidiDevice.java +++ b/media/java/android/media/midi/MidiDevice.java @@ -19,6 +19,7 @@ package android.media.midi; import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.util.Log; @@ -181,9 +182,16 @@ public final class MidiDevice implements Closeable { } try { IBinder token = new Binder(); - mDeviceServer.connectPorts(token, pfd, outputPortNumber); - // close our copy of the file descriptor - IoUtils.closeQuietly(pfd); + int calleePid = mDeviceServer.connectPorts(token, pfd, outputPortNumber); + // If the service is a different Process then it will duplicate the pfd + // and we can safely close this one. + // But if the service is in the same Process then closing the pfd will + // kill the connection. So don't do that. + if (calleePid != Process.myPid()) { + // close our copy of the file descriptor + IoUtils.closeQuietly(pfd); + } + return new MidiConnection(token, inputPort); } catch (RemoteException e) { Log.e(TAG, "RemoteException in connectPorts"); diff --git a/media/java/android/media/midi/MidiDeviceServer.java b/media/java/android/media/midi/MidiDeviceServer.java index 19ff624601556..f0abf711ba162 100644 --- a/media/java/android/media/midi/MidiDeviceServer.java +++ b/media/java/android/media/midi/MidiDeviceServer.java @@ -254,7 +254,7 @@ public final class MidiDeviceServer implements Closeable { } @Override - public void connectPorts(IBinder token, ParcelFileDescriptor pfd, + public int connectPorts(IBinder token, ParcelFileDescriptor pfd, int outputPortNumber) { MidiInputPort inputPort = new MidiInputPort(pfd, outputPortNumber); MidiDispatcher dispatcher = mOutputPortDispatchers[outputPortNumber]; @@ -270,6 +270,7 @@ public final class MidiDeviceServer implements Closeable { synchronized (mPortClients) { mPortClients.put(token, client); } + return Process.myPid(); // for caller to detect same process ID } @Override