Miroslav Franc 549cdb
From: Nathan Chancellor <nathan@kernel.org>
Miroslav Franc 549cdb
Date: Thu, 3 Nov 2022 10:01:28 -0700
Miroslav Franc 549cdb
Subject: s390/ctcm: Fix return type of ctc{mp,}m_tx()
Miroslav Franc 549cdb
Git-commit: aa5bf80c3c067b82b4362cd6e8e2194623bcaca6
Miroslav Franc 549cdb
Patch-mainline: v6.2-rc1
Miroslav Franc 549cdb
References: git-fixes bsc#1211686
Miroslav Franc 549cdb
Miroslav Franc 549cdb
With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG),
Miroslav Franc 549cdb
indirect call targets are validated against the expected function
Miroslav Franc 549cdb
pointer prototype to make sure the call target is valid to help mitigate
Miroslav Franc 549cdb
ROP attacks. If they are not identical, there is a failure at run time,
Miroslav Franc 549cdb
which manifests as either a kernel panic or thread getting killed. A
Miroslav Franc 549cdb
proposed warning in clang aims to catch these at compile time, which
Miroslav Franc 549cdb
reveals:
Miroslav Franc 549cdb
Miroslav Franc 549cdb
  drivers/s390/net/ctcm_main.c:1064:21: error: incompatible function pointer types initializing 'netdev_tx_t (*)(struct sk_buff *, struct net_device *)' (aka 'enum netdev_tx (*)(struct sk_buff *, struct net_device *)') with an expression of type 'int (struct sk_buff *, struct net_device *)' [-Werror,-Wincompatible-function-pointer-types-strict]
Miroslav Franc 549cdb
          .ndo_start_xmit         = ctcm_tx,
Miroslav Franc 549cdb
                                    ^~~~~~~
Miroslav Franc 549cdb
  drivers/s390/net/ctcm_main.c:1072:21: error: incompatible function pointer types initializing 'netdev_tx_t (*)(struct sk_buff *, struct net_device *)' (aka 'enum netdev_tx (*)(struct sk_buff *, struct net_device *)') with an expression of type 'int (struct sk_buff *, struct net_device *)' [-Werror,-Wincompatible-function-pointer-types-strict]
Miroslav Franc 549cdb
          .ndo_start_xmit         = ctcmpc_tx,
Miroslav Franc 549cdb
                                    ^~~~~~~~~
Miroslav Franc 549cdb
Miroslav Franc 549cdb
->ndo_start_xmit() in 'struct net_device_ops' expects a return type of
Miroslav Franc 549cdb
'netdev_tx_t', not 'int'. Adjust the return type of ctc{mp,}m_tx() to
Miroslav Franc 549cdb
match the prototype's to resolve the warning and potential CFI failure,
Miroslav Franc 549cdb
should s390 select ARCH_SUPPORTS_CFI_CLANG in the future.
Miroslav Franc 549cdb
Miroslav Franc 549cdb
Additionally, while in the area, remove a comment block that is no
Miroslav Franc 549cdb
longer relevant.
Miroslav Franc 549cdb
Miroslav Franc 549cdb
Link: https://github.com/ClangBuiltLinux/linux/issues/1750
Miroslav Franc 549cdb
Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
Miroslav Franc 549cdb
Reviewed-by: Kees Cook <keescook@chromium.org>
Miroslav Franc 549cdb
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Miroslav Franc 549cdb
Signed-off-by: David S. Miller <davem@davemloft.net>
Miroslav Franc 549cdb
Acked-by: Miroslav Franc <mfranc@suse.cz>
Miroslav Franc 549cdb
---
Miroslav Franc 549cdb
 drivers/s390/net/ctcm_main.c | 11 ++---------
Miroslav Franc 549cdb
 1 file changed, 2 insertions(+), 9 deletions(-)
Miroslav Franc 549cdb
Miroslav Franc 549cdb
diff --git a/drivers/s390/net/ctcm_main.c b/drivers/s390/net/ctcm_main.c
Miroslav Franc 549cdb
index 37b551bd43bf..bdfab9ea0046 100644
Miroslav Franc 549cdb
--- a/drivers/s390/net/ctcm_main.c
Miroslav Franc 549cdb
+++ b/drivers/s390/net/ctcm_main.c
Miroslav Franc 549cdb
@@ -825,16 +825,9 @@ static int ctcmpc_transmit_skb(struct channel *ch, struct sk_buff *skb)
Miroslav Franc 549cdb
 /**
Miroslav Franc 549cdb
  * Start transmission of a packet.
Miroslav Franc 549cdb
  * Called from generic network device layer.
Miroslav Franc 549cdb
- *
Miroslav Franc 549cdb
- *  skb		Pointer to buffer containing the packet.
Miroslav Franc 549cdb
- *  dev		Pointer to interface struct.
Miroslav Franc 549cdb
- *
Miroslav Franc 549cdb
- * returns 0 if packet consumed, !0 if packet rejected.
Miroslav Franc 549cdb
- *         Note: If we return !0, then the packet is free'd by
Miroslav Franc 549cdb
- *               the generic network layer.
Miroslav Franc 549cdb
  */
Miroslav Franc 549cdb
 /* first merge version - leaving both functions separated */
Miroslav Franc 549cdb
-static int ctcm_tx(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 549cdb
+static netdev_tx_t ctcm_tx(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 549cdb
 {
Miroslav Franc 549cdb
 	struct ctcm_priv *priv = dev->ml_priv;
Miroslav Franc 549cdb
 
Miroslav Franc 549cdb
@@ -877,7 +870,7 @@ static int ctcm_tx(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 549cdb
 }
Miroslav Franc 549cdb
 
Miroslav Franc 549cdb
 /* unmerged MPC variant of ctcm_tx */
Miroslav Franc 549cdb
-static int ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 549cdb
+static netdev_tx_t ctcmpc_tx(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 549cdb
 {
Miroslav Franc 549cdb
 	int len = 0;
Miroslav Franc 549cdb
 	struct ctcm_priv *priv = dev->ml_priv;
Miroslav Franc 549cdb