ipv4: Check !in_dev earlier for ioctl(SIOCSIFADDR).
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 9 Aug 2024 23:54:02 +0000 (16:54 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 16 Aug 2024 01:56:13 +0000 (18:56 -0700)
dev->ip_ptr could be NULL if we set an invalid MTU.

Even then, if we issue ioctl(SIOCSIFADDR) for a new IPv4 address,
devinet_ioctl() allocates struct in_ifaddr and fails later in
inet_set_ifa() because in_dev is NULL.

Let's move the check earlier.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20240809235406.50187-2-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/devinet.c

index d96f3e452fef6d6a2fce56ede8a26a5c6b311426..ddab1511645425a3a6ee2da1e22f15457b534171 100644 (file)
@@ -574,10 +574,6 @@ static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
 
        ASSERT_RTNL();
 
-       if (!in_dev) {
-               inet_free_ifa(ifa);
-               return -ENOBUFS;
-       }
        ipv4_devconf_setall(in_dev);
        neigh_parms_data_state_setall(in_dev->arp_parms);
        if (ifa->ifa_dev != in_dev) {
@@ -1184,6 +1180,8 @@ int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
 
                if (!ifa) {
                        ret = -ENOBUFS;
+                       if (!in_dev)
+                               break;
                        ifa = inet_alloc_ifa();
                        if (!ifa)
                                break;