| Index: content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| index fde50c8f4b2427b5b341b8026ae88bbb11505a8f..0deff1fa93b9987ad7a3a816b74c37e8ce9c9414 100644
|
| --- a/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| +++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| @@ -53,7 +53,12 @@ import java.util.concurrent.atomic.AtomicReference;
|
| public class ChildProcessServiceImpl {
|
| private static final String MAIN_THREAD_NAME = "ChildProcessMain";
|
| private static final String TAG = "ChildProcessService";
|
| +
|
| + // Lock that protects the following members.
|
| + private final Object mBinderLock = new Object();
|
| private IChildProcessCallback mCallback;
|
| + // PID of the client of this service, set in bindToCaller().
|
| + private int mBoundCallingPid;
|
|
|
| // This is the native "Main" thread for the renderer / utility process.
|
| private Thread mMainThread;
|
| @@ -97,10 +102,38 @@ public class ChildProcessServiceImpl {
|
| private final IChildProcessService.Stub mBinder = new IChildProcessService.Stub() {
|
| // NOTE: Implement any IChildProcessService methods here.
|
| @Override
|
| + public boolean bindToCaller() {
|
| + synchronized (mBinderLock) {
|
| + int callingPid = Binder.getCallingPid();
|
| + if (mBoundCallingPid == 0) {
|
| + mBoundCallingPid = callingPid;
|
| + } else if (mBoundCallingPid != callingPid) {
|
| + Log.e(TAG, "Service is already bound by pid %d, cannot bind for pid %d",
|
| + mBoundCallingPid, callingPid);
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + @Override
|
| public int setupConnection(Bundle args, IChildProcessCallback callback) {
|
| - mCallback = callback;
|
| - getServiceInfo(args);
|
| - return Process.myPid();
|
| + int callingPid = Binder.getCallingPid();
|
| + synchronized (mBinderLock) {
|
| + if (mBoundCallingPid != callingPid) {
|
| + if (mBoundCallingPid == 0) {
|
| + Log.e(TAG, "Service has not been bound with bindToCaller()");
|
| + } else {
|
| + Log.e(TAG, "Client pid %d does not match the bound pid %d", callingPid,
|
| + mBoundCallingPid);
|
| + }
|
| + return -1;
|
| + }
|
| +
|
| + mCallback = callback;
|
| + getServiceInfo(args);
|
| + return Process.myPid();
|
| + }
|
| }
|
|
|
| @Override
|
|
|