diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pulsecore/core-util.c | 15 | 
1 files changed, 12 insertions, 3 deletions
| diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 19e12963..a199daa3 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -2896,7 +2896,7 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode) {  #ifdef O_CLOEXEC      if ((fd = open(fn, flags|O_CLOEXEC, mode)) >= 0) -        return fd; +        goto finish;      if (errno != EINVAL)          return fd; @@ -2905,6 +2905,10 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode) {      if ((fd = open(fn, flags, mode)) < 0)          return fd; +finish: +    /* Some implementations might simply ignore O_CLOEXEC if it is not +     * understood, make sure FD_CLOEXEC is enabled anyway */ +      pa_make_fd_cloexec(fd);      return fd;  } @@ -2914,7 +2918,7 @@ int pa_socket_cloexec(int domain, int type, int protocol) {  #ifdef SOCK_CLOEXEC      if ((fd = socket(domain, type | SOCK_CLOEXEC, protocol)) >= 0) -        return fd; +        goto finish;      if (errno != EINVAL)          return fd; @@ -2923,6 +2927,10 @@ int pa_socket_cloexec(int domain, int type, int protocol) {      if ((fd = socket(domain, type, protocol)) < 0)          return fd; +finish: +    /* Some implementations might simply ignore SOCK_CLOEXEC if it is +     * not understood, make sure FD_CLOEXEC is enabled anyway */ +      pa_make_fd_cloexec(fd);      return fd;  } @@ -2932,7 +2940,7 @@ int pa_pipe_cloexec(int pipefd[2]) {  #ifdef HAVE_PIPE2      if ((r = pipe2(pipefd, O_CLOEXEC)) >= 0) -        return r; +        goto finish;      if (errno != EINVAL && errno != ENOSYS)          return r; @@ -2941,6 +2949,7 @@ int pa_pipe_cloexec(int pipefd[2]) {      if ((r = pipe(pipefd)) < 0)          return r; +finish:      pa_make_fd_cloexec(pipefd[0]);      pa_make_fd_cloexec(pipefd[1]); | 
