Structures which are about to be copied to userspace shouldn't have
uninitialized fields or paddings.
memset() the whole &ip_tunnel_parm in ip_tunnel_parm_to_user() before
filling it with the kernel data. The compilers will hopefully combine
writes to it.

Fixes: 117aef12a7b1 ("ip_tunnel: use a separate struct to store tunnel params 
in the kernel")
Reported-by: Dan Carpenter <[email protected]>
Closes: 
https://lore.kernel.org/netdev/[email protected]
Signed-off-by: Alexander Lobakin <[email protected]>
---
 net/ipv4/ip_tunnel.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
index f63b573f66dc..6ec4365cefa5 100644
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@ -1034,6 +1034,8 @@ bool ip_tunnel_parm_to_user(void __user *data, struct 
ip_tunnel_parm_kern *kp)
            !ip_tunnel_flags_is_be16_compat(kp->o_flags))
                return false;
 
+       memset(&p, 0, sizeof(p));
+
        strscpy(p.name, kp->name);
        p.link = kp->link;
        p.i_flags = ip_tunnel_flags_to_be16(kp->i_flags);
-- 
2.44.0

Reply via email to