PATCH udev close on exec
selinux wants a clean fd set, so better close all open fds
udevd.c renamed from udevd.c.cloexec +2 -0
@@ -478,6 +478,8 @@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 ) {
namedev.c renamed from namedev.c.cloexec +2 -4
@@ -454,10 +454,8 @@switch (pid) {case 0 :/* child */ -close (STDOUT_FILENO ); - -/* dup write side of pipe to STDOUT */ -dup (fds[1 ]); +/* dup2 write side of pipe to STDOUT */ +dup2 (fds[1 ],STDOUT_FILENO );if (argv[0 ] !=NULL ) {dbg ("execute '%s' with given arguments" , argv[0 ]); retval =execv (argv[0 ], argv);
tdb/tdb.c renamed from tdb/tdb.c.cloexec +7 -0
@@ -65,6 +65,7 @@#include <signal.h> #include "tdb.h" #include "spinlock.h" +#include "../udev_lib.h" #else #include "includes.h" #endif
@@ -1736,6 +1737,12 @@ goto fail;/* errno set by open(2) */ } +/* +Close file when execing another process. +Prevents SELinux access errors. +*/ +set_cloexec_flag (tdb->fd,1 ); +/* ensure there is only one process initialising at once */ if (tdb_brlock (tdb,GLOBAL_LOCK ,F_WRLCK ,F_SETLKW ,0 ) ==-1 ) { TDB_LOG((tdb, 0, "tdb_open_ex: failed to get global lock on %s: %s\n",
dev_d.c renamed from dev_d.c.cloexec +13 -0
@@ -23,9 +23,13 @@#include <string.h> #include <sys/types.h> #include <sys/wait.h> +#include <sys/stat.h> #include <unistd.h> +#include <fcntl.h> +#include "udev.h" #include "udev_lib.h" +#include "udevdb.h" #include "logging.h" #define DEVD_DIR "/etc/dev.d/"
@@ -34,6 +38,7 @@static int run_program (char *name) {pid_t pid; +int fd;dbg ("running %s" , name);
@@ -41,6 +46,14 @@switch (pid) {case 0 :/* child */ +udevdb_exit ();/* close udevdb */ + fd =open ("/dev/null" ,O_RDWR ); +if ( fd >=0 ) { +dup2 (fd,STDOUT_FILENO ); +dup2 (fd,STDIN_FILENO ); +dup2 (fd,STDERR_FILENO ); + } +close (fd);execv (name, main_argv);dbg ("exec of child failed" );exit (1 );
udev_lib.h renamed from udev_lib.h.cloexec +1 -1
@@ -84,6 +84,6 @@extern void leading_slash (char *path);extern void no_leading_slash (char *path);extern int call_foreach_file (int fnct (char *f) ,char *filename,char *extension); - +extern int set_cloexec_flag (int desc,int value);#endif
udev_lib.c renamed from udev_lib.c.cloexec +19 -0
@@ -255,3 +255,22 @@closedir (dir);return 0 ; } + +/* Set the FD_CLOEXEC flag of desc if value is nonzero, +or clear the flag if value is 0. +Return 0 on success, or -1 on error with errno set. */ + +int set_cloexec_flag (int desc,int value) +{ +int oldflags =fcntl (desc,F_GETFD ,0 ); +/* If reading the flags failed, return error indication now. */ +if (oldflags <0 ) +return oldflags; +/* Set just the flag we want to set. */ +if (value !=0 ) + oldflags |=FD_CLOEXEC ; +else + oldflags &= ~FD_CLOEXEC ; +/* Store modified flag word in the descriptor. */ +return fcntl (desc,F_SETFD , oldflags); +}
udevsend.c renamed from udevsend.c.cloexec +2 -0
@@ -171,6 +171,8 @@ goto fallback; } +set_cloexec_flag (sock,1 ); +memset (&saddr,0x00 ,sizeof (struct sockaddr_un )); saddr.sun_family =AF_LOCAL ;/* use abstract namespace for socket path */