Denis Kirjanov 8d0bcb
From a33f669662b9a96da36c48b703eb5672209249d0 Mon Sep 17 00:00:00 2001
Denis Kirjanov 8d0bcb
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
Denis Kirjanov 8d0bcb
Date: Sat, 7 Aug 2021 15:27:03 +0200
Denis Kirjanov 8d0bcb
Subject: [PATCH 3/7] ppp: Fix generating ifname when empty IFLA_IFNAME is
Denis Kirjanov 8d0bcb
 specified
Denis Kirjanov 8d0bcb
Git-commit: 2459dcb96bcba94c08d6861f8a050185ff301672
Denis Kirjanov 8d0bcb
Patch-mainline: v5.14-rc6
Denis Kirjanov 8d0bcb
References: git-fixes
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
IFLA_IFNAME is nul-term string which means that IFLA_IFNAME buffer can be
Denis Kirjanov 8d0bcb
larger than length of string which contains.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
Function __rtnl_newlink() generates new own ifname if either IFLA_IFNAME
Denis Kirjanov 8d0bcb
was not specified at all or userspace passed empty nul-term string.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
It is expected that if userspace does not specify ifname for new ppp netdev
Denis Kirjanov 8d0bcb
then kernel generates one in format "ppp<id>" where id matches to the ppp
Denis Kirjanov 8d0bcb
unit id which can be later obtained by PPPIOCGUNIT ioctl.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
And it works in this way if IFLA_IFNAME is not specified at all. But it
Denis Kirjanov 8d0bcb
does not work when IFLA_IFNAME is specified with empty string.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
So fix this logic also for empty IFLA_IFNAME in ppp_nl_newlink() function
Denis Kirjanov 8d0bcb
and correctly generates ifname based on ppp unit identifier if userspace
Denis Kirjanov 8d0bcb
did not provided preferred ifname.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
Without this patch when IFLA_IFNAME was specified with empty string then
Denis Kirjanov 8d0bcb
kernel created a new ppp interface in format "ppp<id>" but id did not
Denis Kirjanov 8d0bcb
match ppp unit id returned by PPPIOCGUNIT ioctl. In this case id was some
Denis Kirjanov 8d0bcb
number generated by __rtnl_newlink() function.
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
Signed-off-by: Pali Rohár <pali@kernel.org>
Denis Kirjanov 8d0bcb
Fixes: bb8082f69138 ("ppp: build ifname using unit identifier for rtnl based devices")
Denis Kirjanov 8d0bcb
Signed-off-by: David S. Miller <davem@davemloft.net>
Denis Kirjanov 8d0bcb
Signed-off-by: Denis Kirjanov <denis.kirjanov@suse.com>
Denis Kirjanov 8d0bcb
---
Denis Kirjanov 8d0bcb
 drivers/net/ppp/ppp_generic.c | 2 +-
Denis Kirjanov 8d0bcb
 1 file changed, 1 insertion(+), 1 deletion(-)
Denis Kirjanov 8d0bcb
Denis Kirjanov 8d0bcb
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
Denis Kirjanov 8d0bcb
index 352e751125fb..56b0bd90a9fb 100644
Denis Kirjanov 8d0bcb
--- a/drivers/net/ppp/ppp_generic.c
Denis Kirjanov 8d0bcb
+++ b/drivers/net/ppp/ppp_generic.c
Denis Kirjanov 8d0bcb
@@ -1116,7 +1116,7 @@ static int ppp_nl_newlink(struct net *src_net, struct net_device *dev,
Denis Kirjanov 8d0bcb
 	 * the PPP unit identifer as suffix (i.e. ppp<unit_id>). This allows
Denis Kirjanov 8d0bcb
 	 * userspace to infer the device name using to the PPPIOCGUNIT ioctl.
Denis Kirjanov 8d0bcb
 	 */
Denis Kirjanov 8d0bcb
-	if (!tb[IFLA_IFNAME])
Denis Kirjanov 8d0bcb
+	if (!tb[IFLA_IFNAME] || !nla_len(tb[IFLA_IFNAME]) || !*(char *)nla_data(tb[IFLA_IFNAME]))
Denis Kirjanov 8d0bcb
 		conf.ifname_is_set = false;
Denis Kirjanov 8d0bcb
 
Denis Kirjanov 8d0bcb
 	err = ppp_dev_configure(src_net, dev, &conf;;
Denis Kirjanov 8d0bcb
-- 
Denis Kirjanov 8d0bcb
2.16.4
Denis Kirjanov 8d0bcb