diff mbox series

[ovs-dev,V3,20/24] datapath: Distribute switch variables for initialization

Message ID 20200916173311.30956-21-gvrose8192@gmail.com
State Changes Requested
Headers show
Series Add support for Linux kernels up to 5.8.x | expand

Commit Message

Gregory Rose Sept. 16, 2020, 5:33 p.m. UTC
From: Kees Cook <keescook@chromium.org>

Upstream commit:
    commit 16a556eeb7ed2dc3709fe2c5be76accdfa4901ab
    Author: Kees Cook <keescook@chromium.org>
    Date:   Wed Feb 19 22:23:09 2020 -0800

    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=44916

    Signed-off-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Cc: Kees Cook <keescook@chromium.org>
Signed-off-by: Greg Rose <gvrose8192@gmail.com>
---
 datapath/flow_netlink.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

Comments

Yi-Hung Wei Sept. 30, 2020, 10:37 p.m. UTC | #1
On Wed, Sep 16, 2020 at 10:35 AM Greg Rose <gvrose8192@gmail.com> wrote:
>
> From: Kees Cook <keescook@chromium.org>
>
> Upstream commit:
>     commit 16a556eeb7ed2dc3709fe2c5be76accdfa4901ab
>     Author: Kees Cook <keescook@chromium.org>
>     Date:   Wed Feb 19 22:23:09 2020 -0800
>
>     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=44916
>
>     Signed-off-by: Kees Cook <keescook@chromium.org>
>     Signed-off-by: David S. Miller <davem@davemloft.net>
>
> Cc: Kees Cook <keescook@chromium.org>
> Signed-off-by: Greg Rose <gvrose8192@gmail.com>
> ---
Acked-by: Yi-Hung Wei <yihung.wei@gmail.com>
diff mbox series

Patch

diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index d3fd77106..996041602 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -2700,10 +2700,6 @@  static int validate_set(const struct nlattr *a,
 		return -EINVAL;
 
 	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_SKB_MARK:
 	case OVS_KEY_ATTR_CT_MARK:
@@ -2715,7 +2711,9 @@  static int validate_set(const struct nlattr *a,
 			return -EINVAL;
 		break;
 
-	case OVS_KEY_ATTR_TUNNEL:
+	case OVS_KEY_ATTR_TUNNEL: {
+		int err;
+
 #ifndef USE_UPSTREAM_TUNNEL
 		if (eth_p_mpls(eth_type))
 			return -EINVAL;
@@ -2728,8 +2726,10 @@  static int validate_set(const struct nlattr *a,
 		if (err)
 			return err;
 		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))
 			return -EINVAL;
 
@@ -2749,8 +2749,10 @@  static int validate_set(const struct nlattr *a,
 				return -EINVAL;
 		}
 		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))
 			return -EINVAL;
 
@@ -2777,7 +2779,7 @@  static int validate_set(const struct nlattr *a,
 			return -EINVAL;
 
 		break;
-
+	}
 	case OVS_KEY_ATTR_TCP:
 		if ((eth_type != htons(ETH_P_IP) &&
 		     eth_type != htons(ETH_P_IPV6)) ||