From: Harald Hoyer <harald@redhat.com>
To: linux-hotplug@vger.kernel.org
Subject: PATCH udev close on exec
Date: Mon, 20 Sep 2004 14:08:23 +0000 [thread overview]
Message-ID: <414EE457.40006@redhat.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 59 bytes --]
selinux wants a clean fd set, so better close all open fds
[-- Attachment #2: udev-030-cloexec.patch --]
[-- Type: text/plain, Size: 3776 bytes --]
--- udev-032/udevd.c.cloexec 2004-09-20 16:01:57.902138264 +0200
+++ udev-032/udevd.c 2004-09-20 16:01:57.910137048 +0200
@@ -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) {
--- udev-032/namedev.c.cloexec 2004-09-20 16:01:57.901138416 +0200
+++ udev-032/namedev.c 2004-09-20 16:01:57.911136896 +0200
@@ -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);
--- udev-032/tdb/tdb.c.cloexec 2004-09-14 07:55:37.000000000 +0200
+++ udev-032/tdb/tdb.c 2004-09-20 16:01:57.912136744 +0200
@@ -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",
--- udev-032/dev_d.c.cloexec 2004-09-20 16:01:57.907137504 +0200
+++ udev-032/dev_d.c 2004-09-20 16:02:44.062120880 +0200
@@ -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-032/udev_lib.h.cloexec 2004-09-14 07:55:34.000000000 +0200
+++ udev-032/udev_lib.h 2004-09-20 16:01:57.914136440 +0200
@@ -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-032/udev_lib.c.cloexec 2004-09-14 07:55:37.000000000 +0200
+++ udev-032/udev_lib.c 2004-09-20 16:01:57.914136440 +0200
@@ -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);
+}
--- udev-032/udevsend.c.cloexec 2004-09-14 07:55:32.000000000 +0200
+++ udev-032/udevsend.c 2004-09-20 16:01:57.915136288 +0200
@@ -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 */
next reply other threads:[~2004-09-20 14:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-20 14:08 Harald Hoyer [this message]
-- strict thread matches above, loose matches on Subject: below --
2004-10-05 23:57 PATCH udev close on exec Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=414EE457.40006@redhat.com \
--to=harald@redhat.com \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).