Commit 16a556ee authored by Kees Cook's avatar Kees Cook Committed by David S. Miller

openvswitch: Distribute switch variables for initialization

Variables declared in a switch statement before any case statements
cannot be automatically initialized with compiler instrumentation (as
they are not part of any execution flow). With GCC's proposed automatic
stack variable initialization feature, this triggers a warning (and they
don't get initialized). Clang's automatic stack variable initialization
(via CONFIG_INIT_STACK_ALL=y) doesn't throw a warning, but it also
doesn't initialize such variables[1]. Note that these warnings (or silent
skipping) happen before the dead-store elimination optimization phase,
so even when the automatic initializations are later elided in favor of
direct initializations, the warnings remain.

To avoid these problems, move such variables into the "case" where
they're used or lift them up into the main function body.

net/openvswitch/flow_netlink.c: In function ‘validate_set’:
net/openvswitch/flow_netlink.c:2711:29: warning: statement will never be executed [-Wswitch-unreachable]
 2711 |  const struct ovs_key_ipv4 *ipv4_key;
      |                             ^~~~~~~~

[1] https://bugs.llvm.org/show_bug.cgi?id=44916Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 46d30cb1
...@@ -2708,10 +2708,6 @@ static int validate_set(const struct nlattr *a, ...@@ -2708,10 +2708,6 @@ static int validate_set(const struct nlattr *a,
return -EINVAL; return -EINVAL;
switch (key_type) { switch (key_type) {
const struct ovs_key_ipv4 *ipv4_key;
const struct ovs_key_ipv6 *ipv6_key;
int err;
case OVS_KEY_ATTR_PRIORITY: case OVS_KEY_ATTR_PRIORITY:
case OVS_KEY_ATTR_SKB_MARK: case OVS_KEY_ATTR_SKB_MARK:
case OVS_KEY_ATTR_CT_MARK: case OVS_KEY_ATTR_CT_MARK:
...@@ -2723,7 +2719,9 @@ static int validate_set(const struct nlattr *a, ...@@ -2723,7 +2719,9 @@ static int validate_set(const struct nlattr *a,
return -EINVAL; return -EINVAL;
break; break;
case OVS_KEY_ATTR_TUNNEL: case OVS_KEY_ATTR_TUNNEL: {
int err;
if (masked) if (masked)
return -EINVAL; /* Masked tunnel set not supported. */ return -EINVAL; /* Masked tunnel set not supported. */
...@@ -2732,8 +2730,10 @@ static int validate_set(const struct nlattr *a, ...@@ -2732,8 +2730,10 @@ static int validate_set(const struct nlattr *a,
if (err) if (err)
return err; return err;
break; break;
}
case OVS_KEY_ATTR_IPV4: {
const struct ovs_key_ipv4 *ipv4_key;
case OVS_KEY_ATTR_IPV4:
if (eth_type != htons(ETH_P_IP)) if (eth_type != htons(ETH_P_IP))
return -EINVAL; return -EINVAL;
...@@ -2753,8 +2753,10 @@ static int validate_set(const struct nlattr *a, ...@@ -2753,8 +2753,10 @@ static int validate_set(const struct nlattr *a,
return -EINVAL; return -EINVAL;
} }
break; break;
}
case OVS_KEY_ATTR_IPV6: {
const struct ovs_key_ipv6 *ipv6_key;
case OVS_KEY_ATTR_IPV6:
if (eth_type != htons(ETH_P_IPV6)) if (eth_type != htons(ETH_P_IPV6))
return -EINVAL; return -EINVAL;
...@@ -2781,7 +2783,7 @@ static int validate_set(const struct nlattr *a, ...@@ -2781,7 +2783,7 @@ static int validate_set(const struct nlattr *a,
return -EINVAL; return -EINVAL;
break; break;
}
case OVS_KEY_ATTR_TCP: case OVS_KEY_ATTR_TCP:
if ((eth_type != htons(ETH_P_IP) && if ((eth_type != htons(ETH_P_IP) &&
eth_type != htons(ETH_P_IPV6)) || eth_type != htons(ETH_P_IPV6)) ||
......
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