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:
committed by
Kay Sievers
parent
52761bb0a9
commit
4b09a2fc43
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user