chiark / gitweb /
rtnl: complain if used after fork
authorTom Gundersen <teg@jklm.no>
Tue, 29 Oct 2013 16:38:31 +0000 (17:38 +0100)
committerTom Gundersen <teg@jklm.no>
Tue, 29 Oct 2013 16:56:09 +0000 (17:56 +0100)
src/libsystemd-rtnl/rtnl-internal.h
src/libsystemd-rtnl/sd-rtnl.c

index f9c08e1a9ad68fd595df573834084bb75bffb0bb..c24d12b907841393070a6ed16b60bdd2ad0d85d3 100644 (file)
@@ -32,6 +32,7 @@ struct sd_rtnl {
         } sockaddr;
 
         unsigned serial;
         } sockaddr;
 
         unsigned serial;
+        pid_t original_pid;
 };
 
 #define RTNL_DEFAULT_TIMEOUT ((usec_t) (10 * USEC_PER_SEC))
 };
 
 #define RTNL_DEFAULT_TIMEOUT ((usec_t) (10 * USEC_PER_SEC))
index b11a813dfe3cea502657b3b194dded9999eb563e..9c1f40e48a7b9be95846eec78062a3e486ebfd88 100644 (file)
@@ -43,10 +43,21 @@ static int sd_rtnl_new(sd_rtnl **ret) {
 
         rtnl->sockaddr.nl.nl_family = AF_NETLINK;
 
 
         rtnl->sockaddr.nl.nl_family = AF_NETLINK;
 
+        rtnl->original_pid = getpid();
+
         *ret = rtnl;
         return 0;
 }
 
         *ret = rtnl;
         return 0;
 }
 
+static bool rtnl_pid_changed(sd_rtnl *rtnl) {
+        assert(rtnl);
+
+        /* We don't support people creating an rtnl connection and
+         * keeping it around over a fork(). Let's complain. */
+
+        return rtnl->original_pid != getpid();
+}
+
 int sd_rtnl_open(uint32_t groups, sd_rtnl **ret) {
         _cleanup_sd_rtnl_unref_ sd_rtnl *rtnl = NULL;
         int r;
 int sd_rtnl_open(uint32_t groups, sd_rtnl **ret) {
         _cleanup_sd_rtnl_unref_ sd_rtnl *rtnl = NULL;
         int r;
@@ -98,6 +109,7 @@ int sd_rtnl_send_with_reply_and_block(sd_rtnl *nl,
         int r, serial;
 
         assert_return(nl, -EINVAL);
         int r, serial;
 
         assert_return(nl, -EINVAL);
+        assert_return(!rtnl_pid_changed(nl), -ECHILD);
         assert_return(message, -EINVAL);
 
         r = message_seal(nl, message);
         assert_return(message, -EINVAL);
 
         r = message_seal(nl, message);