#include <fcntl.h>
#include "klibc_fixups.h"
#include <sys/sysinfo.h>
+#include <sys/stat.h>
#include "list.h"
#include "udev.h"
static int pipefds[2];
static unsigned long long expected_seqnum = 0;
-volatile static int children_waiting;
-volatile static int run_msg_q;
-volatile static int sig_flag;
+static volatile int children_waiting;
+static volatile int run_msg_q;
+static volatile int sig_flag;
static int run_exec_q;
static LIST_HEAD(msg_list);
return;
}
-asmlinkage static void sig_handler(int signum)
+static void asmlinkage sig_handler(int signum)
{
int rc;
int ssock, maxsockplus;
struct sockaddr_un saddr;
socklen_t addrlen;
- int retval;
+ int retval, fd;
const int on = 1;
struct sigaction act;
fd_set readfds;
dbg("need to be root, exit");
exit(1);
}
+ /* make sure we are at top of dir */
+ chdir("/");
+ umask( umask( 077 ) | 022 );
+ /* Set fds to dev/null */
+ fd = open( "/dev/null", O_RDWR );
+ if ( fd < 0 ) {
+ dbg("error opening /dev/null %s", strerror(errno));
+ exit(1);
+ }
+ dup2(fd, 0);
+ dup2(fd, 1);
+ dup2(fd, 2);
+ if (fd > 2)
+ close(fd);
+ /* Get new session id so stray signals don't come our way. */
+ setsid();
/* setup signal handler pipe */
retval = pipe(pipefds);
}
retval = fcntl(pipefds[0], F_SETFL, O_NONBLOCK);
- if (retval < 0) {
+ if (retval < 0) {
+ dbg("error fcntl on read pipe: %s", strerror(errno));
+ exit(1);
+ }
+ retval = fcntl(pipefds[0], F_SETFD, FD_CLOEXEC);
+ if (retval < 0) {
dbg("error fcntl on read pipe: %s", strerror(errno));
exit(1);
}
dbg("error fcntl on write pipe: %s", strerror(errno));
exit(1);
}
+ retval = fcntl(pipefds[1], F_SETFD, FD_CLOEXEC);
+ if (retval < 0) {
+ dbg("error fcntl on write pipe: %s", strerror(errno));
+ exit(1);
+ }
+
/* set signal handlers */
- act.sa_handler = sig_handler;
+ act.sa_handler = (void (*) (int))sig_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_RESTART;
sigaction(SIGINT, &act, NULL);
exit(1);
}
+ set_cloexec_flag(ssock, 1);
+
/* the bind takes care of ensuring only one copy running */
retval = bind(ssock, (struct sockaddr *) &saddr, addrlen);
if (retval < 0) {
dbg("bind failed, exit");
goto exit;
}
+ retval = fcntl(ssock, F_SETFD, FD_CLOEXEC);
+ if (retval < 0) {
+ dbg("error fcntl on ssock: %s", strerror(errno));
+ exit(1);
+ }
/* enable receiving of the sender credentials */
setsockopt(ssock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));