All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hangbin Liu <hangbin.liu@linux.dev>
To: Janis Edvarts Lacis <janislacis06@gmail.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, horms@kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH net] net: vlan: fix vlan name truncation
Date: Thu, 10 Sep 2026 16:15:32 +0800	[thread overview]
Message-ID: <aqJnJBNbcv1LTV_7@fedora> (raw)
In-Reply-To: <20260904210024.263220-1-janislacis06@gmail.com>

On Sat, Sep 05, 2026 at 12:00:24AM +0300, Janis Edvarts Lacis wrote:
> register_vlan_device() from net/8021q/vlan.c sets name based on a field
> name_type from struct vlan_net. If name_type is VLAN_NAME_TYPE_RAW_PLUS_VID
> or VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD, register_vlan_device() sets vlan
> device's name to the actual net_device's name and adds vid at the end of
> this name separated by a dot.
> 
> Network interface's name is limited to at most 16 characters, including NUL.
> Therefore, if the real_dev->name is long enough, then adding the vid
> at the end of this name can lead to the result exceeding 16 bytes which
> leads to a truncated name for the vlan device created in register_vlan_device().
> 
> This patch fixes the issue by returning -ENAMETOOLONG from
> register_vlan_device() if the newly created name does not fit in 16
> bytes.
> 
> The bug was discovered when compiling with flag W=1, the following warning comes up:
> linux/net/8021q/vlan.c: In function ‘vlan_ioctl_handler’:
> linux/net/8021q/vlan.c:250:46: error: ‘%i’ directive output may be truncated writing between 1 and 5 bytes into a region of size between 0 and 15 [-Werror=format-truncation=]
>   250 |                 snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
>       |                                              ^~
> In function ‘register_vlan_device’,
>     inlined from ‘vlan_ioctl_handler’ at linux/net/8021q/vlan.c:588:9:
> linux/net/8021q/vlan.c:250:42: note: directive argument in the range [0, 65535]
>   250 |                 snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
>       |                                          ^~~~~~~
> 
> Build & run the reproducer:
>     gcc poc.c -o poc
>     chmod +x poc.sh
>     ./poc.sh
> 
> ======BEGIN poc.sh======
> #!/usr/bin/env bash
> 
> sudo ip link add vlan1234567890 type dummy
> sudo ./poc
> 
> # name will not match the expected printed from poc.c on the unpatched
> # kernel, there will be no vlan interface at all on the patched one
> ip a
> ======END poc.sh========
> 
> ======BEGIN poc.c======
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
> #include <sys/ioctl.h>
> #include <linux/if.h>
> #include <linux/if_vlan.h>
> #include <linux/sockios.h>
> 
> #define IF_NAME "vlan1234567890"
> 
> int main()
> {
>     struct vlan_ioctl_args args = {
> 	.cmd = ADD_VLAN_CMD,
> 	.u.VID = 1234,
>     };
> 
>     strcpy(args.device1, IF_NAME);
> 
>     int fd = socket(AF_INET, SOCK_STREAM, 0);
>     if (fd < 0) {
> 	perror("socket");
> 	return 1;
>     }
> 
>     /* fails with -ENAMETOOLONG */
>     if (ioctl(fd, SIOCSIFVLAN, &args) < 0) {
> 	perror("SIOCSIFVLAN");
> 	close(fd);
> 	return 1;
>     }
> 
>     printf("Expected name: %s.%i\n", IF_NAME, args.u.VID);
>     close(fd);
>     return 0;
> }
> ======END poc.c========
> 
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Janis Edvarts Lacis <janislacis06@gmail.com>
> ---
>  net/8021q/vlan.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
> index 2d2efb877975..b51092d217de 100644
> --- a/net/8021q/vlan.c
> +++ b/net/8021q/vlan.c
> @@ -220,7 +220,7 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
>  	struct net *net = dev_net(real_dev);
>  	struct vlan_net *vn = net_generic(net, vlan_net_id);
>  	char name[IFNAMSIZ];
> -	int err;
> +	int err, len;
>  
>  	if (vlan_id >= VLAN_VID_MASK)
>  		return -ERANGE;
> @@ -234,7 +234,9 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
>  	switch (vn->name_type) {
>  	case VLAN_NAME_TYPE_RAW_PLUS_VID:
>  		/* name will look like:	 eth1.0005 */
> -		snprintf(name, IFNAMSIZ, "%s.%.4i", real_dev->name, vlan_id);
> +		len = snprintf(name, IFNAMSIZ, "%s.%.4i", real_dev->name, vlan_id);
> +		if (len >= sizeof(name))
> +			err = -ENAMETOOLONG;
>  		break;
>  	case VLAN_NAME_TYPE_PLUS_VID_NO_PAD:
>  		/* Put our vlan.VID in the name.
> @@ -246,7 +248,9 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
>  		/* Put our vlan.VID in the name.
>  		 * Name will look like:	 eth0.5
>  		 */
> -		snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
> +		len = snprintf(name, IFNAMSIZ, "%s.%i", real_dev->name, vlan_id);
> +		if (len >= sizeof(name))
> +			err = -ENAMETOOLONG;
>  		break;
>  	case VLAN_NAME_TYPE_PLUS_VID:
>  		/* Put our vlan.VID in the name.
> @@ -256,6 +260,9 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
>  		snprintf(name, IFNAMSIZ, "vlan%.4i", vlan_id);
>  	}
>  
> +	if (err)
> +		return err;
> +
>  	new_dev = alloc_netdev(sizeof(struct vlan_dev_priv), name,
>  			       NET_NAME_UNKNOWN, vlan_setup);
>  
> -- 
> 2.43.0
> 

Nice catch!

Reviewed-by: Hangbin Liu <liuhangbin@kylinos.cn>

  reply	other threads:[~2026-09-10  8:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-04 21:00 [PATCH net] net: vlan: fix vlan name truncation Janis Edvarts Lacis
2026-09-10  8:15 ` Hangbin Liu [this message]
2026-09-10 10:56 ` Paolo Abeni
2026-09-11 16:35   ` Janis Edvarts Lacis
2026-09-11 21:45     ` David Laight

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aqJnJBNbcv1LTV_7@fedora \
    --to=hangbin.liu@linux.dev \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=janislacis06@gmail.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.