aboutgitcodebugslistschat
path: root/netlink.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-06-27 20:22:33 +1000
committerStefano Brivio <sbrivio@redhat.com>2023-06-27 17:52:30 +0200
commit289301b39c40dfb9f48f54d9848fbc19a17523ba (patch)
tree5ed00c4e99988c25117374b389ca4affddb8cc2b /netlink.c
parent32660cea04f6e7c353435061b876575539ac8cd9 (diff)
downloadpasst-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar.gz
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar.bz2
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar.lz
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar.xz
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.tar.zst
passt-289301b39c40dfb9f48f54d9848fbc19a17523ba.zip
netlink: Use correct interface index in NL_SET mode2023_06_27.289301b
nl_addr() and nl_route() take an 'op' selector which affects a number of parameters to the netlink call. Unfortunately when we introduced this option a bug was introduced so that we always use the interface index for the host side, rather than the one for the pasta namespace. Really, the entire interface to nl_addr() and nl_route() is pretty bad: it's tightly coupled with the use cases of its callers. This is a minimal fix which doesn't address that, but also doesn't make it significantly worse. Link: https://bugs.passt.top/show_bug.cgi?id=59 Fixes: 2fe046185634 ("netlink: Add functionality to copy routes from outer namespace") Fixes: e89da3cf03b2 ("netlink: Add functionality to copy addresses from outer namespace") Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'netlink.c')
-rw-r--r--netlink.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/netlink.c b/netlink.c
index bc5b2bf..e15e23f 100644
--- a/netlink.c
+++ b/netlink.c
@@ -226,7 +226,7 @@ void nl_route(enum nl_op op, unsigned int ifi, unsigned int ifi_ns,
.rta.rta_type = RTA_OIF,
.rta.rta_len = RTA_LENGTH(sizeof(unsigned int)),
- .ifi = ifi,
+ .ifi = op == NL_SET ? ifi_ns : ifi,
};
unsigned dup_routes = 0;
ssize_t n, nlmsgs_size;
@@ -370,7 +370,7 @@ void nl_addr(enum nl_op op, unsigned int ifi, unsigned int ifi_ns,
.nlh.nlmsg_seq = nl_seq++,
.ifa.ifa_family = af,
- .ifa.ifa_index = ifi,
+ .ifa.ifa_index = op == NL_SET ? ifi_ns : ifi,
.ifa.ifa_prefixlen = op == NL_SET ? *prefix_len : 0,
};
ssize_t n, nlmsgs_size;