libnl-tiny: set SOCK_CLOEXEC if available
authorJoerg Vehlow <joerg.vehlow@aox.de>
Wed, 26 Oct 2022 08:21:04 +0000 (10:21 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Tue, 1 Nov 2022 16:00:30 +0000 (17:00 +0100)
If CLOEXEC is not set on the netlink socket, restarting netifd using ubus
fails with "Failed to initialize system control", because the bind call
in nl_connect fails with EADDRINUSE, due to the inherited socket handle.

Also it does not make sense, to leak the handle to child processes.

See libnl3: ca0fc7558 ("socket: Set SOCK_CLOEXEC if available")

Signed-off-by: Joerg Vehlow <joerg.vehlow@aox.de>
nl.c

diff --git a/nl.c b/nl.c
index c875573bb05c8ea4d54c2f8eab418ccf39200f21..32d26a3f763525f525b66e4e6a5b7923935a3051 100644 (file)
--- a/nl.c
+++ b/nl.c
 int nl_connect(struct nl_sock *sk, int protocol)
 {
        int err;
+       int flags = 0;
        socklen_t addrlen;
 
-       sk->s_fd = socket(AF_NETLINK, SOCK_RAW, protocol);
+#ifdef SOCK_CLOEXEC
+       flags = SOCK_CLOEXEC;
+#endif
+
+       sk->s_fd = socket(AF_NETLINK, SOCK_RAW | flags, protocol);
        if (sk->s_fd < 0) {
                err = -nl_syserr2nlerr(errno);
                goto errout;