lkml.org 
[lkml]   [2022]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    SubjectRe: [PATCH 2/3] s390/netiucv: Fix return type of netiucv_tx()
    From


    On 02.11.22 17:32, Nathan Chancellor wrote:
    > With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG),
    > indirect call targets are validated against the expected function
    > pointer prototype to make sure the call target is valid to help mitigate
    > ROP attacks. If they are not identical, there is a failure at run time,
    > which manifests as either a kernel panic or thread getting killed. A
    > proposed warning in clang aims to catch these at compile time, which
    > reveals:
    >
    > drivers/s390/net/netiucv.c:1854: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]
    > .ndo_start_xmit = netiucv_tx,
    > ^~~~~~~~~~
    >
    > ->ndo_start_xmit() in 'struct net_device_ops' expects a return type of
    > 'netdev_tx_t', not 'int'. Adjust the return type of netiucv_tx() to
    > match the prototype's to resolve the warning and potential CFI failure,
    > should s390 select ARCH_SUPPORTS_CFI_CLANG in the future.
    >
    > Link: https://github.com/ClangBuiltLinux/linux/issues/1750
    > Signed-off-by: Nathan Chancellor <nathan@kernel.org>
    > ---
    > drivers/s390/net/netiucv.c | 2 +-
    > 1 file changed, 1 insertion(+), 1 deletion(-)
    >
    > diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
    > index 65aa0a96c21d..1a7f2bc3a87b 100644
    > --- a/drivers/s390/net/netiucv.c
    > +++ b/drivers/s390/net/netiucv.c
    > @@ -1256,7 +1256,7 @@ static int netiucv_close(struct net_device *dev)
    > * Note: If we return !0, then the packet is free'd by
    > * the generic network layer.
    > */
    > -static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
    > +static netdev_tx_t netiucv_tx(struct sk_buff *skb, struct net_device *dev)
    > {
    > struct netiucv_priv *privptr = netdev_priv(dev);
    > int rc;

    Could you please also remove the corresponding comments:
    diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
    index 65aa0a96c21d..21e36f63fbc7 100644
    --- a/drivers/s390/net/netiucv.c
    +++ b/drivers/s390/net/netiucv.c
    @@ -1248,13 +1248,6 @@ static int netiucv_close(struct net_device *dev)
    /*
    * Start transmission of a packet.
    * Called from generic network device layer.
    - *
    - * @param skb Pointer to buffer containing the packet.
    - * @param dev Pointer to interface struct.
    - *
    - * @return 0 if packet consumed, !0 if packet rejected.
    - * Note: If we return !0, then the packet is free'd by
    - * the generic network layer.
    */
    static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
    {
    Reviewed-by: Alexandra Winter <wintera@linux.ibm.com>

    \
     
     \ /
      Last update: 2022-11-03 13:10    [W:3.031 / U:0.516 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site