OSDN Git Service

Zygote : Block SIGCHLD during fork. am: b1f1209d9a am: 35b8453338
authorNarayan Kamath <narayan@google.com>
Thu, 10 Nov 2016 11:17:48 +0000 (11:17 +0000)
committerandroid-build-merger <android-build-merger@google.com>
Thu, 10 Nov 2016 11:17:48 +0000 (11:17 +0000)
am: 14bd75fa79

Change-Id: I9b2acc6d40cc0f4724598f97b704c040bba15417

1  2 
core/jni/com_android_internal_os_Zygote.cpp

@@@ -428,8 -441,25 +428,22 @@@ static pid_t ForkAndSpecializeCommon(JN
                                       jstring java_se_info, jstring java_se_name,
                                       bool is_system_server, jintArray fdsToClose,
                                       jstring instructionSet, jstring dataDir) {
 -  uint64_t start = MsTime();
    SetSigChldHandler();
 -  ckTime(start, "ForkAndSpecializeCommon:SetSigChldHandler");
 -
  
+   sigset_t sigchld;
+   sigemptyset(&sigchld);
+   sigaddset(&sigchld, SIGCHLD);
+   // Temporarily block SIGCHLD during forks. The SIGCHLD handler might
+   // log, which would result in the logging FDs we close being reopened.
+   // This would cause failures because the FDs are not whitelisted.
+   //
+   // Note that the zygote process is single threaded at this point.
+   if (sigprocmask(SIG_BLOCK, &sigchld, NULL) == -1) {
+     ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno));
+     RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_BLOCK, { SIGCHLD }) failed.");
+   }
    // Close any logging related FDs before we start evaluating the list of
    // file descriptors.
    __android_log_close();