Miroslav Franc 17ca88
From: Nathan Chancellor <nathan@kernel.org>
Miroslav Franc 17ca88
Date: Thu, 3 Nov 2022 10:01:30 -0700
Miroslav Franc 17ca88
Subject: s390/lcs: Fix return type of lcs_start_xmit()
Miroslav Franc 17ca88
Git-commit: bb16db8393658e0978c3f0d30ae069e878264fa3
Miroslav Franc 17ca88
Patch-mainline: v6.2-rc1
Miroslav Franc 17ca88
References: git-fixes bsc#1211690
Miroslav Franc 17ca88
Miroslav Franc 17ca88
With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG),
Miroslav Franc 17ca88
indirect call targets are validated against the expected function
Miroslav Franc 17ca88
pointer prototype to make sure the call target is valid to help mitigate
Miroslav Franc 17ca88
ROP attacks. If they are not identical, there is a failure at run time,
Miroslav Franc 17ca88
which manifests as either a kernel panic or thread getting killed. A
Miroslav Franc 17ca88
proposed warning in clang aims to catch these at compile time, which
Miroslav Franc 17ca88
reveals:
Miroslav Franc 17ca88
Miroslav Franc 17ca88
  drivers/s390/net/lcs.c:2090: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 17ca88
          .ndo_start_xmit         = lcs_start_xmit,
Miroslav Franc 17ca88
                                    ^~~~~~~~~~~~~~
Miroslav Franc 17ca88
  drivers/s390/net/lcs.c:2097: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 17ca88
          .ndo_start_xmit         = lcs_start_xmit,
Miroslav Franc 17ca88
                                    ^~~~~~~~~~~~~~
Miroslav Franc 17ca88
Miroslav Franc 17ca88
->ndo_start_xmit() in 'struct net_device_ops' expects a return type of
Miroslav Franc 17ca88
'netdev_tx_t', not 'int'. Adjust the return type of lcs_start_xmit() to
Miroslav Franc 17ca88
match the prototype's to resolve the warning and potential CFI failure,
Miroslav Franc 17ca88
should s390 select ARCH_SUPPORTS_CFI_CLANG in the future.
Miroslav Franc 17ca88
Miroslav Franc 17ca88
Link: https://github.com/ClangBuiltLinux/linux/issues/1750
Miroslav Franc 17ca88
Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>
Miroslav Franc 17ca88
Reviewed-by: Kees Cook <keescook@chromium.org>
Miroslav Franc 17ca88
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
Miroslav Franc 17ca88
Signed-off-by: David S. Miller <davem@davemloft.net>
Miroslav Franc 17ca88
Acked-by: Miroslav Franc <mfranc@suse.cz>
Miroslav Franc 17ca88
---
Miroslav Franc 17ca88
 drivers/s390/net/lcs.c | 8 +++-----
Miroslav Franc 17ca88
 1 file changed, 3 insertions(+), 5 deletions(-)
Miroslav Franc 17ca88
Miroslav Franc 17ca88
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
Miroslav Franc 17ca88
index 84c8981317b4..38f312664ce7 100644
Miroslav Franc 17ca88
--- a/drivers/s390/net/lcs.c
Miroslav Franc 17ca88
+++ b/drivers/s390/net/lcs.c
Miroslav Franc 17ca88
@@ -1519,9 +1519,8 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
Miroslav Franc 17ca88
 /**
Miroslav Franc 17ca88
  * Packet transmit function called by network stack
Miroslav Franc 17ca88
  */
Miroslav Franc 17ca88
-static int
Miroslav Franc 17ca88
-__lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
Miroslav Franc 17ca88
-		 struct net_device *dev)
Miroslav Franc 17ca88
+static netdev_tx_t __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
Miroslav Franc 17ca88
+				    struct net_device *dev)
Miroslav Franc 17ca88
 {
Miroslav Franc 17ca88
 	struct lcs_header *header;
Miroslav Franc 17ca88
 	int rc = NETDEV_TX_OK;
Miroslav Franc 17ca88
@@ -1582,8 +1581,7 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
Miroslav Franc 17ca88
 	return rc;
Miroslav Franc 17ca88
 }
Miroslav Franc 17ca88
 
Miroslav Franc 17ca88
-static int
Miroslav Franc 17ca88
-lcs_start_xmit(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 17ca88
+static netdev_tx_t lcs_start_xmit(struct sk_buff *skb, struct net_device *dev)
Miroslav Franc 17ca88
 {
Miroslav Franc 17ca88
 	struct lcs_card *card;
Miroslav Franc 17ca88
 	int rc;
Miroslav Franc 17ca88