treewide: correctly apply IFNAMSIZ limit
authorJo-Philipp Wich <jo@mein.io>
Thu, 17 Nov 2022 08:09:09 +0000 (09:09 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 17 Nov 2022 08:13:49 +0000 (09:13 +0100)
The `IFNAMSIZ` macro defines the required buffer size to hold a Linux
interface name including the terminating zero byte while netifd currently
uses an `IFNAMSIZ + 1` limit for interface name buffers.

This causes netifd to use overlong names (16 instead of 15 bytes) in
netlink communication with the kernel, leading to netlink failure replies
due to policy violations.

Fix this issue by applying the correct length, that is `IFNAMSIZ` directly,
to the corresponding buffers.

Ref: https://github.com/openwrt/openwrt/issues/11259
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
device.h
iprule.h
system-linux.c
vlan.c

index 37f8c37c58a35f948c2476ac9c89389838246136..6751628b9b330269f0af06a3678353e8192c3529 100644 (file)
--- a/device.h
+++ b/device.h
@@ -219,7 +219,7 @@ struct device {
        struct vlist_tree vlans;
        struct kvlist vlan_aliases;
 
-       char ifname[IFNAMSIZ + 1];
+       char ifname[IFNAMSIZ];
        int ifindex;
 
        struct blob_attr *config;
index 6d91d061e04109d28ba052c4fb0f75fb4b7c1903..488aafc69c3a7bc305139f58035280776e7a6246 100644 (file)
--- a/iprule.h
+++ b/iprule.h
@@ -77,8 +77,8 @@ struct iprule {
        struct interface_user out_iface_user;
 
        /* device name */
-       char in_dev[IFNAMSIZ + 1];
-       char out_dev[IFNAMSIZ + 1];
+       char in_dev[IFNAMSIZ];
+       char out_dev[IFNAMSIZ];
 
        /* everything below is used as avl tree key */
        /* don't change the order                   */
index 0f13a99f135b607ae1c718ba54f3e479e6741dfc..9fe869fd8d151d6df19bf725a9e616bde4276dcf 100644 (file)
@@ -1030,7 +1030,7 @@ int system_bonding_set_port(struct device *dev, struct device *port, bool add, b
 {
        const char *port_name = port->ifname;
        const char op_ch = add ? '+' : '-';
-       char buf[IFNAMSIZ + 2];
+       char buf[IFNAMSIZ + 1];
 
        snprintf(buf, sizeof(buf), "%c%s", op_ch, port_name);
        system_if_down(port);
diff --git a/vlan.c b/vlan.c
index 23b20a954a7be058412c15cb59f0cb7175cd5551..3d444a94c19e913880d0250aa6f34991beb59849 100644 (file)
--- a/vlan.c
+++ b/vlan.c
@@ -128,7 +128,7 @@ static int vlan_set_device_state(struct device *dev, bool up)
 
 static void vlan_dev_cb(struct device_user *dep, enum device_event ev)
 {
-       char name[IFNAMSIZ + 1];
+       char name[IFNAMSIZ];
        struct vlan_device *vldev;
 
        vldev = container_of(dep, struct vlan_device, dep);
@@ -175,7 +175,7 @@ static struct device *get_vlan_device(struct device *dev, char *id_str, bool cre
        };
        struct vlan_device *vldev;
        struct device_user *dep;
-       char name[IFNAMSIZ + 1];
+       char name[IFNAMSIZ];
        char *err = NULL;
        int id, *alias_id;