avoid leaking netlink socket fd to external programs

The netlink socket is now used by udev event processes. We should take
care not to pass it to the programs they execute. This is the same way
the inotify fd was handled.

Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
This commit is contained in:
Alan Jenkins
2009-04-06 07:23:35 -07:00
committed by Kay Sievers
parent 52761bb0a9
commit 4b09a2fc43
4 changed files with 19 additions and 10 deletions
+3
View File
@@ -92,6 +92,8 @@ struct udev_monitor *udev_monitor_new_from_socket(struct udev *udev, const char
free(udev_monitor);
return NULL;
}
util_set_fd_cloexec(udev_monitor->sock);
dbg(udev, "monitor %p created with '%s'\n", udev_monitor, socket_path);
return udev_monitor;
}
@@ -125,6 +127,7 @@ struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char
free(udev_monitor);
return NULL;
}
util_set_fd_cloexec(udev_monitor->sock);
udev_monitor->snl.nl_family = AF_NETLINK;
udev_monitor->snl.nl_groups = group;
+1
View File
@@ -172,4 +172,5 @@ extern size_t util_strlcat(char *dst, const char *src, size_t size);
extern int udev_util_replace_whitespace(const char *str, char *to, size_t len);
extern int udev_util_replace_chars(char *str, const char *white);
extern int udev_util_encode_string(const char *str, char *str_enc, size_t len);
extern void util_set_fd_cloexec(int fd);
#endif
+12
View File
@@ -448,3 +448,15 @@ int udev_util_encode_string(const char *str, char *str_enc, size_t len)
err:
return -1;
}
void util_set_fd_cloexec(int fd)
{
int flags;
flags = fcntl(fd, F_GETFD);
if (flags < 0)
flags = FD_CLOEXEC;
else
flags |= FD_CLOEXEC;
fcntl(fd, F_SETFD, flags);
}
+3 -10
View File
@@ -41,16 +41,9 @@ int inotify_fd = -1;
void udev_watch_init(struct udev *udev)
{
inotify_fd = inotify_init();
if (inotify_fd >= 0) {
int flags;
flags = fcntl(inotify_fd, F_GETFD);
if (flags < 0)
flags = FD_CLOEXEC;
else
flags |= FD_CLOEXEC;
fcntl(inotify_fd, F_SETFD, flags);
} else if (errno == ENOSYS)
if (inotify_fd >= 0)
util_set_fd_cloexec(inotify_fd);
else if (errno == ENOSYS)
info(udev, "unable to use inotify, udevd will not monitor rule files changes\n");
else
err(udev, "inotify_init failed: %m\n");