| Index: content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| index 4d26d2a20fd646381a557b51176d0e13d1c1417f..450f2ab6104cd59c001eea5fb48af096fb96669a 100644
|
| --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| @@ -18,6 +18,8 @@ import org.chromium.base.JNINamespace;
|
| import org.chromium.base.SysUtils;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.content.app.ChildProcessService;
|
| +import org.chromium.content.app.Linker;
|
| +import org.chromium.content.app.LinkerParams;
|
| import org.chromium.content.app.PrivilegedProcessService;
|
| import org.chromium.content.app.SandboxedProcessService;
|
| import org.chromium.content.common.IChildProcessCallback;
|
| @@ -83,7 +85,8 @@ public class ChildProcessLauncher {
|
| }
|
|
|
| public ChildProcessConnection allocate(
|
| - Context context, ChildProcessConnection.DeathCallback deathCallback) {
|
| + Context context, ChildProcessConnection.DeathCallback deathCallback,
|
| + LinkerParams linkerParams) {
|
| synchronized(mConnectionLock) {
|
| if (mFreeConnectionIndices.isEmpty()) {
|
| Log.w(TAG, "Ran out of service." );
|
| @@ -92,7 +95,7 @@ public class ChildProcessLauncher {
|
| int slot = mFreeConnectionIndices.remove(0);
|
| assert mChildProcessConnections[slot] == null;
|
| mChildProcessConnections[slot] = new ChildProcessConnection(context, slot,
|
| - mInSandbox, deathCallback, mChildClass);
|
| + mInSandbox, deathCallback, mChildClass, linkerParams);
|
| return mChildProcessConnections[slot];
|
| }
|
| }
|
| @@ -139,7 +142,8 @@ public class ChildProcessLauncher {
|
| sSandboxedChildConnectionAllocator : sPrivilegedChildConnectionAllocator;
|
| }
|
|
|
| - private static ChildProcessConnection allocateConnection(Context context, boolean inSandbox) {
|
| + private static ChildProcessConnection allocateConnection(Context context,
|
| + boolean inSandbox, LinkerParams linkerParams) {
|
| ChildProcessConnection.DeathCallback deathCallback =
|
| new ChildProcessConnection.DeathCallback() {
|
| @Override
|
| @@ -148,12 +152,37 @@ public class ChildProcessLauncher {
|
| }
|
| };
|
| sConnectionAllocated = true;
|
| - return getConnectionAllocator(inSandbox).allocate(context, deathCallback);
|
| + return getConnectionAllocator(inSandbox).allocate(context, deathCallback, linkerParams);
|
| + }
|
| +
|
| + private static boolean sLinkerInitialized = false;
|
| + private static long sLinkerLoadAddress = 0;
|
| +
|
| + private static LinkerParams getLinkerParamsForNewConnection() {
|
| + if (!sLinkerInitialized) {
|
| + if (Linker.isUsed()) {
|
| + sLinkerLoadAddress = Linker.getBaseLoadAddress();
|
| + if (sLinkerLoadAddress == 0) {
|
| + Log.i(TAG, "Shared RELRO support disabled!");
|
| + }
|
| + }
|
| + sLinkerInitialized = true;
|
| + }
|
| +
|
| + if (sLinkerLoadAddress == 0)
|
| + return null;
|
| +
|
| + // Always wait for the shared RELROs in service processes.
|
| + final boolean waitForSharedRelros = true;
|
| + return new LinkerParams(sLinkerLoadAddress,
|
| + waitForSharedRelros,
|
| + Linker.getTestRunnerClassName());
|
| }
|
|
|
| private static ChildProcessConnection allocateBoundConnection(Context context,
|
| String[] commandLine, boolean inSandbox) {
|
| - ChildProcessConnection connection = allocateConnection(context, inSandbox);
|
| + LinkerParams linkerParams = getLinkerParamsForNewConnection();
|
| + ChildProcessConnection connection = allocateConnection(context, inSandbox, linkerParams);
|
| if (connection != null) {
|
| connection.start(commandLine);
|
| }
|
| @@ -485,8 +514,11 @@ public class ChildProcessLauncher {
|
| // TODO(sievers): Revisit this as it doesn't correctly handle the utility process
|
| // assert callbackType != CALLBACK_FOR_UNKNOWN_PROCESS;
|
|
|
| - connection.setupConnection(commandLine, filesToBeMapped, createCallback(callbackType),
|
| - connectionCallback);
|
| + connection.setupConnection(commandLine,
|
| + filesToBeMapped,
|
| + createCallback(callbackType),
|
| + connectionCallback,
|
| + Linker.getSharedRelros());
|
| }
|
|
|
| /**
|
|
|