Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3dcb0d0 authored by Hans Boehm's avatar Hans Boehm
Browse files

More consistently retry system calls on EINTR

We were not retrying an accept() call om EINTR, resulting in occasional
zygote failures. This fixes that, and a few other calls documented
to potentially return EINTR. This is based on a quick seacrh of the
two files affected by this CL.

Bug: 193753947
Bug: 187992348
Test: Build and boot AOSP
Change-Id: Icbfb38be5110607c121545e5c200ce65d1eefbfe
parent 0df5bbfe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -874,7 +874,7 @@ static void DetachDescriptors(JNIEnv* env,

    for (int fd : fds_to_close) {
      ALOGV("Switching descriptor %d to /dev/null", fd);
      if (dup3(devnull_fd, fd, O_CLOEXEC) == -1) {
      if (TEMP_FAILURE_RETRY(dup3(devnull_fd, fd, O_CLOEXEC)) == -1) {
        fail_fn(StringPrintf("Failed dup3() on descriptor %d: %s", fd, strerror(errno)));
      }
    }
+4 −4
Original line number Diff line number Diff line
@@ -426,7 +426,7 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly(
      tmp_pid >>= 8;
    }
    pid_buf[4] = 0;  // Process is not wrapped.
    int res = write(session_socket, pid_buf, 5);
    int res = TEMP_FAILURE_RETRY(write(session_socket, pid_buf, 5));
    if (res != 5) {
      if (res == -1) {
        (first_time ? fail_fn_1 : fail_fn_n)
@@ -451,18 +451,18 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly(
      }
      // We've now seen either a disconnect or connect request.
      close(session_socket);
      int new_fd = accept(zygote_socket_fd, nullptr, nullptr);
      int new_fd = TEMP_FAILURE_RETRY(accept(zygote_socket_fd, nullptr, nullptr));
      if (new_fd == -1) {
        fail_fn_z(CREATE_ERROR("Accept(%d) failed: %s", zygote_socket_fd, strerror(errno)));
      }
      if (new_fd != session_socket) {
          // Move new_fd back to the old value, so that we don't have to change Java-level data
          // structures to reflect a change. This implicitly closes the old one.
          if (dup2(new_fd, session_socket) != session_socket) {
          if (TEMP_FAILURE_RETRY(dup2(new_fd, session_socket)) != session_socket) {
            fail_fn_z(CREATE_ERROR("Failed to move fd %d to %d: %s",
                                   new_fd, session_socket, strerror(errno)));
          }
          close(new_fd);
          close(new_fd);  //  On Linux, fd is closed even if EINTR is returned.
      }
      // If we ever return, we effectively reuse the old Java ZygoteConnection.
      // None of its state needs to change.