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