Thread (12 messages) flat view 12 messages, 7 authors, 2019-11-21

Re: [PATCH] net: Zeroing the structure ethtool_wolinfo in ethtool_get_wol()

From: Joe Perches <joe@perches.com>
Date: 2019-10-26 15:52:46
Also in: bpf, lkml

On Sat, 2019-10-26 at 17:24 +0300, Dan Carpenter wrote:
On Sat, Oct 26, 2019 at 03:54:16PM +0800, zhanglin wrote:
quoted
memset() the structure ethtool_wolinfo that has padded bytes
but the padded bytes have not been zeroed out.
[]
quoted
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
[]
quoted
@@ -1471,11 +1471,13 @@ static int ethtool_reset(struct net_device *dev, char __user *useraddr)
 
 static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 {
-	struct ethtool_wolinf wol = { .cmd = ETHTOOL_GWOL };
+	struct ethtool_wolinfo wol;
 
How did you detect that they weren't initialized?  Is this a KASAN
thing?

Most of the time GCC will zero out the padding bytes when you have an
initializer like this, but sometimes it just makes the intialization a
series of assignments which leaves the holes uninitialized.  I wish I
knew the rules so that I could check for it in Smatch.  Or even better,
I wish that there were an option to always zero the holes in this
situation...
The standard doesn't specify what happens to the padding so
it's not just for gcc, it's compiler dependent.

So anything that's used in a copy_to_user with any possible
padding should either be zalloc'd or memset before assigned.

In this case:

include/uapi/linux/ethtool.h:#define SOPASS_MAX 6

and

include/uapi/linux/ethtool.h:struct ethtool_wolinfo {
include/uapi/linux/ethtool.h-   __u32   cmd;
include/uapi/linux/ethtool.h-   __u32   supported;
include/uapi/linux/ethtool.h-   __u32   wolopts;
include/uapi/linux/ethtool.h-   __u8    sopass[SOPASS_MAX];
include/uapi/linux/ethtool.h-};

so there's likely a couple bytes of trailing padding.

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help