moonbridge

changeset 206:56efa825bfc7

Code cleanup regarding SOCK_CLOEXEC in moonbridge_io.c
author jbe
date Sun Jun 21 22:40:52 2015 +0200 (2015-06-21)
parents 5601a486e68a
children 2dd0eea2f5f8
files moonbridge_io.c
line diff
     1.1 --- a/moonbridge_io.c	Sun Jun 21 20:10:21 2015 +0200
     1.2 +++ b/moonbridge_io.c	Sun Jun 21 22:40:52 2015 +0200
     1.3 @@ -1242,13 +1242,13 @@
     1.4    argv = lua_newuserdata(L, (argc + 1) * sizeof(char *));
     1.5    for (i=0; i<argc; i++) argv[i] = (char *)luaL_checkstring(L, i+1);
     1.6    argv[argc] = NULL;
     1.7 -  if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sockin)) {
     1.8 +  if (socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, sockin)) {
     1.9      moonbr_io_errmsg();
    1.10      lua_pushnil(L);
    1.11      lua_pushfstring(L, "Could not create socket pair: %s", errmsg);
    1.12      return 2;
    1.13    }
    1.14 -  if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sockout)) {
    1.15 +  if (socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, sockout)) {
    1.16      moonbr_io_errmsg();
    1.17      close(sockin[0]);
    1.18      close(sockin[1]);
    1.19 @@ -1256,7 +1256,7 @@
    1.20      lua_pushfstring(L, "Could not create socket pair: %s", errmsg);
    1.21      return 2;
    1.22    }
    1.23 -  if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sockerr)) {
    1.24 +  if (socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, sockerr)) {
    1.25      moonbr_io_errmsg();
    1.26      close(sockin[0]);
    1.27      close(sockin[1]);
    1.28 @@ -1281,27 +1281,22 @@
    1.29      return 2;
    1.30    }
    1.31    if (!child->pid) {
    1.32 -    if (dup2(sockin[1], 0) == -1) {
    1.33 -      errorcond = 1;
    1.34 -      strerror_r(errno, (char *)errmsgbuf, MOONBR_IO_MAXSTRERRORLEN);
    1.35 -      _exit(0);
    1.36 -    }
    1.37 -    if (dup2(sockout[1], 1) == -1) {
    1.38 -      errorcond = 1;
    1.39 -      strerror_r(errno, (char *)errmsgbuf, MOONBR_IO_MAXSTRERRORLEN);
    1.40 -      _exit(0);
    1.41 -    }
    1.42 -    if (dup2(sockerr[1], 2) == -1) {
    1.43 -      errorcond = 1;
    1.44 -      strerror_r(errno, (char *)errmsgbuf, MOONBR_IO_MAXSTRERRORLEN);
    1.45 -      _exit(0);
    1.46 -    }
    1.47 +    if (dup2(sockin[1], 0) == -1) goto moonbr_io_exec_error;
    1.48 +    if (dup2(sockout[1], 1) == -1) goto moonbr_io_exec_error;
    1.49 +    if (dup2(sockerr[1], 2) == -1) goto moonbr_io_exec_error;
    1.50      closefrom(4);
    1.51 +    if (fcntl(0, F_SETFD, 0) == -1) goto moonbr_io_exec_error;
    1.52 +    if (fcntl(1, F_SETFD, 0) == -1) goto moonbr_io_exec_error;
    1.53 +    if (fcntl(2, F_SETFD, 0) == -1) goto moonbr_io_exec_error;
    1.54      if (execvp(argv[0], argv)) {
    1.55        errorcond = 2;
    1.56        strerror_r(errno, (char *)errmsgbuf, MOONBR_IO_MAXSTRERRORLEN);
    1.57        _exit(0);
    1.58      }
    1.59 +    moonbr_io_exec_error:
    1.60 +    errorcond = 1;
    1.61 +    strerror_r(errno, (char *)errmsgbuf, MOONBR_IO_MAXSTRERRORLEN);
    1.62 +    _exit(0);
    1.63    }
    1.64    close(sockin[1]);
    1.65    close(sockout[1]);
    1.66 @@ -1322,27 +1317,6 @@
    1.67      else lua_pushfstring(L, "Error in fork: %s", errmsgbuf);
    1.68      return 2;
    1.69    }
    1.70 -  if (fcntl(sockin[0], F_SETFD, FD_CLOEXEC) == -1) {
    1.71 -    moonbr_io_errmsg();
    1.72 -    close(sockin[0]);
    1.73 -    close(sockout[0]);
    1.74 -    close(sockerr[0]);
    1.75 -    luaL_error(L, "Error in fcntl call: %s", errmsg);
    1.76 -  }
    1.77 -  if (fcntl(sockout[0], F_SETFD, FD_CLOEXEC) == -1) {
    1.78 -    moonbr_io_errmsg();
    1.79 -    close(sockin[0]);
    1.80 -    close(sockout[0]);
    1.81 -    close(sockerr[0]);
    1.82 -    luaL_error(L, "Error in fcntl call: %s", errmsg);
    1.83 -  }
    1.84 -  if (fcntl(sockerr[0], F_SETFD, FD_CLOEXEC) == -1) {
    1.85 -    moonbr_io_errmsg();
    1.86 -    close(sockin[0]);
    1.87 -    close(sockout[0]);
    1.88 -    close(sockerr[0]);
    1.89 -    luaL_error(L, "Error in fcntl call: %s", errmsg);
    1.90 -  }
    1.91    /* close sockets during garbage collection in case a Lua error is raised */
    1.92    child->uninitialized_in = sockin[0];
    1.93    child->uninitialized_out = sockout[0];

Impressum / About Us