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