Bug 1471025: Part 3c - Also pass the shared preference map handle to Android content processes. r=jld

MozReview-Commit-ID: CTjDzVC9gcD

--HG--
extra : intermediate-source : 7c03b7dd00e9675f9ac045ed1ea733eb0486904f
extra : absorb_source : c79df6bd9ebbec3454fcca1a81cbfa540ad91a3e
extra : source : 38f690f30e78764763bb012045073fa781efa691
extra : histedit_source : 544ff4257f38fae99a800276d06eb0d719882ca2
This commit is contained in:
Kris Maglione 2018-07-13 11:06:58 -07:00
parent f071708db7
commit b744713e4e
11 changed files with 51 additions and 23 deletions

View file

@ -83,12 +83,19 @@ SetUpSandboxEnvironment()
#ifdef ANDROID #ifdef ANDROID
static int gPrefsFd = -1; static int gPrefsFd = -1;
static int gPrefMapFd = -1;
void void
SetPrefsFd(int aFd) SetPrefsFd(int aFd)
{ {
gPrefsFd = aFd; gPrefsFd = aFd;
} }
void
SetPrefMapFd(int aFd)
{
gPrefMapFd = aFd;
}
#endif #endif
bool bool
@ -228,6 +235,9 @@ ContentProcess::Init(int aArgc, char* aArgv[])
// Android is different; get the FD via gPrefsFd instead of a fixed fd. // Android is different; get the FD via gPrefsFd instead of a fixed fd.
MOZ_RELEASE_ASSERT(gPrefsFd != -1); MOZ_RELEASE_ASSERT(gPrefsFd != -1);
prefsHandle = Some(base::FileDescriptor(gPrefsFd, /* auto_close */ true)); prefsHandle = Some(base::FileDescriptor(gPrefsFd, /* auto_close */ true));
FileDescriptor::UniquePlatformHandle handle(gPrefMapFd);
prefMapHandle.emplace(handle.get());
#elif XP_UNIX #elif XP_UNIX
prefsHandle = Some(base::FileDescriptor(kPrefsFileDescriptor, prefsHandle = Some(base::FileDescriptor(kPrefsFileDescriptor,
/* auto_close */ true)); /* auto_close */ true));

View file

@ -50,8 +50,10 @@ private:
}; };
#ifdef ANDROID #ifdef ANDROID
// Android doesn't use -prefsHandle, it gets that FD another way. // Android doesn't use -prefsHandle or -prefMapHandle. It gets those FDs
// another way.
void SetPrefsFd(int aFd); void SetPrefsFd(int aFd);
void SetPrefMapFd(int aFd);
#endif #endif
} // namespace dom } // namespace dom

View file

@ -1242,7 +1242,7 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type,
const base::file_handle_mapping_vector& fds_to_remap, const base::file_handle_mapping_vector& fds_to_remap,
ProcessHandle* process_handle) ProcessHandle* process_handle)
{ {
MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 4)); MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 5));
JNIEnv* const env = mozilla::jni::GetEnvForThread(); JNIEnv* const env = mozilla::jni::GetEnvForThread();
MOZ_ASSERT(env); MOZ_ASSERT(env);
@ -1258,18 +1258,19 @@ GeckoChildProcessHost::LaunchAndroidService(const char* type,
// which they append to fds_to_remap. There must be a better way to do it. // which they append to fds_to_remap. There must be a better way to do it.
// See bug 1440207. // See bug 1440207.
int32_t prefsFd = fds_to_remap[0].first; int32_t prefsFd = fds_to_remap[0].first;
int32_t ipcFd = fds_to_remap[1].first; int32_t prefMapFd = fds_to_remap[1].first;
int32_t ipcFd = fds_to_remap[2].first;
int32_t crashFd = -1; int32_t crashFd = -1;
int32_t crashAnnotationFd = -1; int32_t crashAnnotationFd = -1;
if (fds_to_remap.size() == 3) {
crashAnnotationFd = fds_to_remap[2].first;
}
if (fds_to_remap.size() == 4) { if (fds_to_remap.size() == 4) {
crashFd = fds_to_remap[2].first;
crashAnnotationFd = fds_to_remap[3].first; crashAnnotationFd = fds_to_remap[3].first;
} }
if (fds_to_remap.size() == 5) {
crashFd = fds_to_remap[3].first;
crashAnnotationFd = fds_to_remap[4].first;
}
int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, ipcFd, crashFd, crashAnnotationFd); int32_t handle = java::GeckoProcessManager::Start(type, jargs, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd);
if (process_handle) { if (process_handle) {
*process_handle = handle; *process_handle = handle;

View file

@ -12,7 +12,8 @@ import android.os.ParcelFileDescriptor;
interface IChildProcess { interface IChildProcess {
int getPid(); int getPid();
boolean start(in IProcessManager procMan, in String[] args, in Bundle extras, int flags, boolean start(in IProcessManager procMan, in String[] args, in Bundle extras, int flags,
in ParcelFileDescriptor prefsPfd, in ParcelFileDescriptor ipcPfd, in ParcelFileDescriptor prefsPfd, in ParcelFileDescriptor prefMapPfd,
in ParcelFileDescriptor ipcPfd,
in ParcelFileDescriptor crashReporterPfd, in ParcelFileDescriptor crashReporterPfd,
in ParcelFileDescriptor crashAnnotationPfd); in ParcelFileDescriptor crashAnnotationPfd);

View file

@ -132,6 +132,7 @@ public class GeckoThread extends Thread {
/* package */ static final String EXTRA_ARGS = "args"; /* package */ static final String EXTRA_ARGS = "args";
private static final String EXTRA_PREFS_FD = "prefsFd"; private static final String EXTRA_PREFS_FD = "prefsFd";
private static final String EXTRA_PREF_MAP_FD = "prefMapFd";
private static final String EXTRA_IPC_FD = "ipcFd"; private static final String EXTRA_IPC_FD = "ipcFd";
private static final String EXTRA_CRASH_FD = "crashFd"; private static final String EXTRA_CRASH_FD = "crashFd";
private static final String EXTRA_CRASH_ANNOTATION_FD = "crashAnnotationFd"; private static final String EXTRA_CRASH_ANNOTATION_FD = "crashAnnotationFd";
@ -153,7 +154,8 @@ public class GeckoThread extends Thread {
private synchronized boolean init(final GeckoProfile profile, final String[] args, private synchronized boolean init(final GeckoProfile profile, final String[] args,
final Bundle extras, final int flags, final Bundle extras, final int flags,
final int prefsFd, final int ipcFd, final int prefsFd, final int prefMapFd,
final int ipcFd,
final int crashFd, final int crashFd,
final int crashAnnotationFd) { final int crashAnnotationFd) {
ThreadUtils.assertOnUiThread(); ThreadUtils.assertOnUiThread();
@ -169,6 +171,7 @@ public class GeckoThread extends Thread {
mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3); mExtras = (extras != null) ? new Bundle(extras) : new Bundle(3);
mExtras.putInt(EXTRA_PREFS_FD, prefsFd); mExtras.putInt(EXTRA_PREFS_FD, prefsFd);
mExtras.putInt(EXTRA_PREF_MAP_FD, prefMapFd);
mExtras.putInt(EXTRA_IPC_FD, ipcFd); mExtras.putInt(EXTRA_IPC_FD, ipcFd);
mExtras.putInt(EXTRA_CRASH_FD, crashFd); mExtras.putInt(EXTRA_CRASH_FD, crashFd);
mExtras.putInt(EXTRA_CRASH_ANNOTATION_FD, crashAnnotationFd); mExtras.putInt(EXTRA_CRASH_ANNOTATION_FD, crashAnnotationFd);
@ -181,18 +184,20 @@ public class GeckoThread extends Thread {
public static boolean initMainProcess(final GeckoProfile profile, final String[] args, public static boolean initMainProcess(final GeckoProfile profile, final String[] args,
final Bundle extras, final int flags) { final Bundle extras, final int flags) {
return INSTANCE.init(profile, args, extras, flags, /* fd */ -1, return INSTANCE.init(profile, args, extras, flags, /* fd */ -1,
/* fd */ -1, /* fd */ -1, /* fd */ -1); /* fd */ -1, /* fd */ -1, /* fd */ -1,
/* fd */ -1);
} }
public static boolean initChildProcess(final String[] args, public static boolean initChildProcess(final String[] args,
final Bundle extras, final Bundle extras,
final int flags, final int flags,
final int prefsFd, final int prefsFd,
final int prefMapFd,
final int ipcFd, final int ipcFd,
final int crashFd, final int crashFd,
final int crashAnnotationFd) { final int crashAnnotationFd) {
return INSTANCE.init(/* profile */ null, args, extras, flags, return INSTANCE.init(/* profile */ null, args, extras, flags,
prefsFd, ipcFd, crashFd, crashAnnotationFd); prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd);
} }
private static boolean canUseProfile(final Context context, final GeckoProfile profile, private static boolean canUseProfile(final Context context, final GeckoProfile profile,
@ -497,6 +502,7 @@ public class GeckoThread extends Thread {
// And go. // And go.
GeckoLoader.nativeRun(args, GeckoLoader.nativeRun(args,
mExtras.getInt(EXTRA_PREFS_FD, -1), mExtras.getInt(EXTRA_PREFS_FD, -1),
mExtras.getInt(EXTRA_PREF_MAP_FD, -1),
mExtras.getInt(EXTRA_IPC_FD, -1), mExtras.getInt(EXTRA_IPC_FD, -1),
mExtras.getInt(EXTRA_CRASH_FD, -1), mExtras.getInt(EXTRA_CRASH_FD, -1),
mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1)); mExtras.getInt(EXTRA_CRASH_ANNOTATION_FD, -1));

View file

@ -456,7 +456,7 @@ public final class GeckoLoader {
public static native boolean verifyCRCs(String apkName); public static native boolean verifyCRCs(String apkName);
// These methods are implemented in mozglue/android/APKOpen.cpp // These methods are implemented in mozglue/android/APKOpen.cpp
public static native void nativeRun(String[] args, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd); public static native void nativeRun(String[] args, int prefsFd, int prefMapFd, int ipcFd, int crashFd, int crashAnnotationFd);
private static native void loadGeckoLibsNative(String apkName); private static native void loadGeckoLibsNative(String apkName);
private static native void loadSQLiteLibsNative(String apkName); private static native void loadSQLiteLibsNative(String apkName);
private static native void loadNSSLibsNative(String apkName); private static native void loadNSSLibsNative(String apkName);

View file

@ -182,9 +182,10 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
@WrapForJNI @WrapForJNI
private static int start(final String type, final String[] args, private static int start(final String type, final String[] args,
final int prefsFd, final int ipcFd, final int prefsFd, final int prefMapFd,
final int ipcFd,
final int crashFd, final int crashAnnotationFd) { final int crashFd, final int crashAnnotationFd) {
return INSTANCE.start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ false); return INSTANCE.start(type, args, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ false);
} }
private int filterFlagsForChild(int flags) { private int filterFlagsForChild(int flags) {
@ -192,7 +193,8 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
GeckoThread.FLAG_ENABLE_NATIVE_CRASHREPORTER); GeckoThread.FLAG_ENABLE_NATIVE_CRASHREPORTER);
} }
private int start(final String type, final String[] args, final int prefsFd, private int start(final String type, final String[] args,
final int prefsFd, final int prefMapFd,
final int ipcFd, final int crashFd, final int ipcFd, final int crashFd,
final int crashAnnotationFd, final boolean retry) { final int crashAnnotationFd, final boolean retry) {
final ChildConnection connection = getConnection(type); final ChildConnection connection = getConnection(type);
@ -203,11 +205,13 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
final Bundle extras = GeckoThread.getActiveExtras(); final Bundle extras = GeckoThread.getActiveExtras();
final ParcelFileDescriptor prefsPfd; final ParcelFileDescriptor prefsPfd;
final ParcelFileDescriptor prefMapPfd;
final ParcelFileDescriptor ipcPfd; final ParcelFileDescriptor ipcPfd;
final ParcelFileDescriptor crashPfd; final ParcelFileDescriptor crashPfd;
final ParcelFileDescriptor crashAnnotationPfd; final ParcelFileDescriptor crashAnnotationPfd;
try { try {
prefsPfd = ParcelFileDescriptor.fromFd(prefsFd); prefsPfd = ParcelFileDescriptor.fromFd(prefsFd);
prefMapPfd = ParcelFileDescriptor.fromFd(prefMapFd);
ipcPfd = ParcelFileDescriptor.fromFd(ipcFd); ipcPfd = ParcelFileDescriptor.fromFd(ipcFd);
crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null; crashPfd = (crashFd >= 0) ? ParcelFileDescriptor.fromFd(crashFd) : null;
crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null; crashAnnotationPfd = (crashAnnotationFd >= 0) ? ParcelFileDescriptor.fromFd(crashAnnotationFd) : null;
@ -220,8 +224,8 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
boolean started = false; boolean started = false;
try { try {
started = child.start(this, args, extras, flags, prefsPfd, ipcPfd, crashPfd, started = child.start(this, args, extras, flags, prefsPfd, prefMapPfd,
crashAnnotationPfd); ipcPfd, crashPfd, crashAnnotationPfd);
} catch (final RemoteException e) { } catch (final RemoteException e) {
} }
@ -232,7 +236,7 @@ public final class GeckoProcessManager extends IProcessManager.Stub {
} }
Log.w(LOGTAG, "Attempting to kill running child " + type); Log.w(LOGTAG, "Attempting to kill running child " + type);
connection.unbind(); connection.unbind();
return start(type, args, prefsFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true); return start(type, args, prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd, /* retry */ true);
} }
try { try {

View file

@ -62,6 +62,7 @@ public class GeckoServiceChildProcess extends Service {
final Bundle extras, final Bundle extras,
final int flags, final int flags,
final ParcelFileDescriptor prefsPfd, final ParcelFileDescriptor prefsPfd,
final ParcelFileDescriptor prefMapPfd,
final ParcelFileDescriptor ipcPfd, final ParcelFileDescriptor ipcPfd,
final ParcelFileDescriptor crashReporterPfd, final ParcelFileDescriptor crashReporterPfd,
final ParcelFileDescriptor crashAnnotationPfd) { final ParcelFileDescriptor crashAnnotationPfd) {
@ -74,6 +75,7 @@ public class GeckoServiceChildProcess extends Service {
} }
final int prefsFd = prefsPfd.detachFd(); final int prefsFd = prefsPfd.detachFd();
final int prefMapFd = prefMapPfd.detachFd();
final int ipcFd = ipcPfd.detachFd(); final int ipcFd = ipcPfd.detachFd();
final int crashReporterFd = crashReporterPfd != null ? final int crashReporterFd = crashReporterPfd != null ?
crashReporterPfd.detachFd() : -1; crashReporterPfd.detachFd() : -1;
@ -83,8 +85,8 @@ public class GeckoServiceChildProcess extends Service {
ThreadUtils.postToUiThread(new Runnable() { ThreadUtils.postToUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, ipcFd, crashReporterFd, if (GeckoThread.initChildProcess(args, extras, flags, prefsFd, prefMapFd, ipcFd,
crashAnnotationFd)) { crashReporterFd, crashAnnotationFd)) {
GeckoThread.launch(); GeckoThread.launch();
} }
} }

View file

@ -393,7 +393,7 @@ FreeArgv(char** argv, int argc)
} }
extern "C" APKOPEN_EXPORT void MOZ_JNICALL extern "C" APKOPEN_EXPORT void MOZ_JNICALL
Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int prefsFd, int ipcFd, int crashFd, int crashAnnotationFd) Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jobjectArray jargs, int prefsFd, int prefMapFd, int ipcFd, int crashFd, int crashAnnotationFd)
{ {
int argc = 0; int argc = 0;
char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc); char** argv = CreateArgvFromObjectArray(jenv, jargs, &argc);
@ -408,7 +408,7 @@ Java_org_mozilla_gecko_mozglue_GeckoLoader_nativeRun(JNIEnv *jenv, jclass jc, jo
gBootstrap->GeckoStart(jenv, argv, argc, sAppData); gBootstrap->GeckoStart(jenv, argv, argc, sAppData);
ElfLoader::Singleton.ExpectShutdown(true); ElfLoader::Singleton.ExpectShutdown(true);
} else { } else {
gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, ipcFd, crashFd, crashAnnotationFd }); gBootstrap->XRE_SetAndroidChildFds(jenv, { prefsFd, prefMapFd, ipcFd, crashFd, crashAnnotationFd });
gBootstrap->XRE_SetProcessType(argv[argc - 1]); gBootstrap->XRE_SetProcessType(argv[argc - 1]);
XREChildData childData; XREChildData childData;

View file

@ -248,6 +248,7 @@ XRE_SetAndroidChildFds (JNIEnv* env, const XRE_AndroidChildFds& fds)
{ {
mozilla::jni::SetGeckoThreadEnv(env); mozilla::jni::SetGeckoThreadEnv(env);
mozilla::dom::SetPrefsFd(fds.mPrefsFd); mozilla::dom::SetPrefsFd(fds.mPrefsFd);
mozilla::dom::SetPrefMapFd(fds.mPrefMapFd);
IPC::Channel::SetClientChannelFd(fds.mIpcFd); IPC::Channel::SetClientChannelFd(fds.mIpcFd);
CrashReporter::SetNotificationPipeForChild(fds.mCrashFd); CrashReporter::SetNotificationPipeForChild(fds.mCrashFd);
CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd); CrashReporter::SetCrashAnnotationPipeForChild(fds.mCrashAnnotationFd);

View file

@ -400,6 +400,7 @@ XRE_API(const char*,
struct XRE_AndroidChildFds struct XRE_AndroidChildFds
{ {
int mPrefsFd; int mPrefsFd;
int mPrefMapFd;
int mIpcFd; int mIpcFd;
int mCrashFd; int mCrashFd;
int mCrashAnnotationFd; int mCrashAnnotationFd;