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];