Commit ee287556 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

net: bareudp: avoid uninitialized variable warning

clang points out that building without IPv6 would lead to returning
an uninitialized variable if a packet with family!=AF_INET is
passed into bareudp_udp_encap_recv():

drivers/net/bareudp.c:139:6: error: variable 'err' is used uninitialized whenever 'if' condition is false [-Werror,-Wsometimes-uninitialized]
        if (family == AF_INET)
            ^~~~~~~~~~~~~~~~~
drivers/net/bareudp.c:146:15: note: uninitialized use occurs here
        if (unlikely(err)) {
                     ^~~
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
 # define unlikely(x)    __builtin_expect(!!(x), 0)
                                            ^
drivers/net/bareudp.c:139:2: note: remove the 'if' if its condition is always true
        if (family == AF_INET)
        ^~~~~~~~~~~~~~~~~~~~~~

This cannot happen in practice, so change the condition in a way that
gcc sees the IPv4 case as unconditionally true here.
For consistency, change all the similar constructs in this file the
same way, using "if(IS_ENABLED())" instead of #if IS_ENABLED()".

Fixes: 571912c6 ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarNathan Chancellor <natechancellor@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8aef1994
...@@ -136,25 +136,21 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) ...@@ -136,25 +136,21 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
oiph = skb_network_header(skb); oiph = skb_network_header(skb);
skb_reset_network_header(skb); skb_reset_network_header(skb);
if (family == AF_INET) if (!IS_ENABLED(CONFIG_IPV6) || family == AF_INET)
err = IP_ECN_decapsulate(oiph, skb); err = IP_ECN_decapsulate(oiph, skb);
#if IS_ENABLED(CONFIG_IPV6)
else else
err = IP6_ECN_decapsulate(oiph, skb); err = IP6_ECN_decapsulate(oiph, skb);
#endif
if (unlikely(err)) { if (unlikely(err)) {
if (log_ecn_error) { if (log_ecn_error) {
if (family == AF_INET) if (!IS_ENABLED(CONFIG_IPV6) || family == AF_INET)
net_info_ratelimited("non-ECT from %pI4 " net_info_ratelimited("non-ECT from %pI4 "
"with TOS=%#x\n", "with TOS=%#x\n",
&((struct iphdr *)oiph)->saddr, &((struct iphdr *)oiph)->saddr,
((struct iphdr *)oiph)->tos); ((struct iphdr *)oiph)->tos);
#if IS_ENABLED(CONFIG_IPV6)
else else
net_info_ratelimited("non-ECT from %pI6\n", net_info_ratelimited("non-ECT from %pI6\n",
&((struct ipv6hdr *)oiph)->saddr); &((struct ipv6hdr *)oiph)->saddr);
#endif
} }
if (err > 1) { if (err > 1) {
++bareudp->dev->stats.rx_frame_errors; ++bareudp->dev->stats.rx_frame_errors;
...@@ -350,7 +346,6 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev, ...@@ -350,7 +346,6 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev,
return err; return err;
} }
#if IS_ENABLED(CONFIG_IPV6)
static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev, static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
struct bareudp_dev *bareudp, struct bareudp_dev *bareudp,
const struct ip_tunnel_info *info) const struct ip_tunnel_info *info)
...@@ -411,7 +406,6 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev, ...@@ -411,7 +406,6 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
dst_release(dst); dst_release(dst);
return err; return err;
} }
#endif
static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev) static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
...@@ -435,11 +429,9 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -435,11 +429,9 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
} }
rcu_read_lock(); rcu_read_lock();
#if IS_ENABLED(CONFIG_IPV6) if (IS_ENABLED(CONFIG_IPV6) && info->mode & IP_TUNNEL_INFO_IPV6)
if (info->mode & IP_TUNNEL_INFO_IPV6)
err = bareudp6_xmit_skb(skb, dev, bareudp, info); err = bareudp6_xmit_skb(skb, dev, bareudp, info);
else else
#endif
err = bareudp_xmit_skb(skb, dev, bareudp, info); err = bareudp_xmit_skb(skb, dev, bareudp, info);
rcu_read_unlock(); rcu_read_unlock();
...@@ -467,7 +459,7 @@ static int bareudp_fill_metadata_dst(struct net_device *dev, ...@@ -467,7 +459,7 @@ static int bareudp_fill_metadata_dst(struct net_device *dev,
use_cache = ip_tunnel_dst_cache_usable(skb, info); use_cache = ip_tunnel_dst_cache_usable(skb, info);
if (ip_tunnel_info_af(info) == AF_INET) { if (!IS_ENABLED(CONFIG_IPV6) || ip_tunnel_info_af(info) == AF_INET) {
struct rtable *rt; struct rtable *rt;
__be32 saddr; __be32 saddr;
...@@ -478,7 +470,6 @@ static int bareudp_fill_metadata_dst(struct net_device *dev, ...@@ -478,7 +470,6 @@ static int bareudp_fill_metadata_dst(struct net_device *dev,
ip_rt_put(rt); ip_rt_put(rt);
info->key.u.ipv4.src = saddr; info->key.u.ipv4.src = saddr;
#if IS_ENABLED(CONFIG_IPV6)
} else if (ip_tunnel_info_af(info) == AF_INET6) { } else if (ip_tunnel_info_af(info) == AF_INET6) {
struct dst_entry *dst; struct dst_entry *dst;
struct in6_addr saddr; struct in6_addr saddr;
...@@ -492,7 +483,6 @@ static int bareudp_fill_metadata_dst(struct net_device *dev, ...@@ -492,7 +483,6 @@ static int bareudp_fill_metadata_dst(struct net_device *dev,
dst_release(dst); dst_release(dst);
info->key.u.ipv6.src = saddr; info->key.u.ipv6.src = saddr;
#endif
} else { } else {
return -EINVAL; return -EINVAL;
} }
......
...@@ -143,14 +143,12 @@ void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb ...@@ -143,14 +143,12 @@ void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb
__be16 df, __be16 src_port, __be16 dst_port, __be16 df, __be16 src_port, __be16 dst_port,
bool xnet, bool nocheck); bool xnet, bool nocheck);
#if IS_ENABLED(CONFIG_IPV6)
int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, struct sk_buff *skb,
struct net_device *dev, struct in6_addr *saddr, struct net_device *dev, struct in6_addr *saddr,
struct in6_addr *daddr, struct in6_addr *daddr,
__u8 prio, __u8 ttl, __be32 label, __u8 prio, __u8 ttl, __be32 label,
__be16 src_port, __be16 dst_port, bool nocheck); __be16 src_port, __be16 dst_port, bool nocheck);
#endif
void udp_tunnel_sock_release(struct socket *sock); void udp_tunnel_sock_release(struct socket *sock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment