]> www.infradead.org Git - users/willy/linux.git/commitdiff
ipv6: ip6_gre: replace strcpy with strscpy for tunnel name
authorMiguel García <miguelgarciaroman8@gmail.com>
Mon, 18 Aug 2025 22:02:03 +0000 (00:02 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 20 Aug 2025 01:06:24 +0000 (18:06 -0700)
Replace the strcpy() call that copies the device name into
tunnel->parms.name with strscpy(), to avoid potential overflow
and guarantee NULL termination. This uses the two-argument
form of strscpy(), where the destination size is inferred
from the array type.

Destination is tunnel->parms.name (size IFNAMSIZ).

Tested in QEMU (Alpine rootfs):
 - Created IPv6 GRE tunnels over loopback
 - Assigned overlay IPv6 addresses
 - Verified bidirectional ping through the tunnel
 - Changed tunnel parameters at runtime (`ip -6 tunnel change`)

Signed-off-by: Miguel García <miguelgarciaroman8@gmail.com>
Link: https://patch.msgid.link/20250818220203.899338-1-miguelgarciaroman8@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/ip6_gre.c

index 74d49dd6124d0fbe2f78dac170c3016ed5169fba..c82a75510c0e2f6b1009b2c63c7ed0179c1badf6 100644 (file)
@@ -329,9 +329,9 @@ static struct ip6_tnl *ip6gre_tunnel_locate(struct net *net,
        if (parms->name[0]) {
                if (!dev_valid_name(parms->name))
                        return NULL;
-               strscpy(name, parms->name, IFNAMSIZ);
+               strscpy(name, parms->name);
        } else {
-               strcpy(name, "ip6gre%d");
+               strscpy(name, "ip6gre%d");
        }
        dev = alloc_netdev(sizeof(*t), name, NET_NAME_UNKNOWN,
                           ip6gre_tunnel_setup);
@@ -1469,7 +1469,7 @@ static int ip6gre_tunnel_init_common(struct net_device *dev)
        tunnel = netdev_priv(dev);
 
        tunnel->dev = dev;
-       strcpy(tunnel->parms.name, dev->name);
+       strscpy(tunnel->parms.name, dev->name);
 
        ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
        if (ret)
@@ -1529,7 +1529,7 @@ static void ip6gre_fb_tunnel_init(struct net_device *dev)
 
        tunnel->dev = dev;
        tunnel->net = dev_net(dev);
-       strcpy(tunnel->parms.name, dev->name);
+       strscpy(tunnel->parms.name, dev->name);
 
        tunnel->hlen            = sizeof(struct ipv6hdr) + 4;
 }
@@ -1842,7 +1842,7 @@ static int ip6erspan_tap_init(struct net_device *dev)
        tunnel = netdev_priv(dev);
 
        tunnel->dev = dev;
-       strcpy(tunnel->parms.name, dev->name);
+       strscpy(tunnel->parms.name, dev->name);
 
        ret = dst_cache_init(&tunnel->dst_cache, GFP_KERNEL);
        if (ret)