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

Commit 74a7b91c authored by Rom Lemarchand's avatar Rom Lemarchand
Browse files

liblogwrap: lock android_fork_execvp

Add a lock around android_fork_execvp to ensure no two threads can
execute it at the same time.

This is to help with http://b/8333626

Change-Id: I75d087a74b58f5b8e878675b301200f54d976fb2
parent 39b7fdea
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <fcntl.h>
#include <libgen.h>
#include <stdbool.h>
#include <pthread.h>

#include <logwrap/logwrap.h>
#include "private/android_filesystem_config.h"
@@ -35,6 +36,7 @@
#define ARRAY_SIZE(x)   (sizeof(x) / sizeof(*(x)))

static int signal_fd_write;
static pthread_mutex_t fd_mutex = PTHREAD_MUTEX_INITIALIZER;

#define ERROR(fmt, args...)                                                   \
do {                                                                          \
@@ -204,6 +206,12 @@ int android_fork_execvp(int argc, char* argv[], int *status, bool ignore_int_qui
    int sockets[2];
    int rc = 0;

    rc = pthread_mutex_lock(&fd_mutex);
    if (rc) {
        ERROR("failed to lock signal_fd mutex\n");
        goto err_lock;
    }

    /* Use ptty instead of socketpair so that STDOUT is not buffered */
    parent_ptty = open("/dev/ptmx", O_RDWR);
    if (parent_ptty < 0) {
@@ -231,6 +239,7 @@ int android_fork_execvp(int argc, char* argv[], int *status, bool ignore_int_qui
        rc = -1;
        goto err_fork;
    } else if (pid == 0) {
        pthread_mutex_unlock(&fd_mutex);
        pthread_sigmask(SIG_SETMASK, &oldset, NULL);
        close(parent_ptty);

@@ -299,5 +308,7 @@ err_fork:
err_ptty:
    close(parent_ptty);
err_open:
    pthread_mutex_unlock(&fd_mutex);
err_lock:
    return rc;
}