[PATCH] can: rockchip_canfd: fix return type of rkcanfd_start_xmit()

Marc Kleine-Budde mkl at pengutronix.de
Tue Sep 10 02:56:56 PDT 2024


On 09.09.2024 15:35:46, Simon Horman wrote:
> On Mon, Sep 09, 2024 at 10:57:06AM +0200, Marc Kleine-Budde wrote:
> > On 09.09.2024 09:44:48, Simon Horman wrote:
> > > On Fri, Sep 06, 2024 at 01:26:41PM -0700, 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
> > > > warning in clang aims to catch these at compile time, which reveals:
> > > > 
> > > >   drivers/net/can/rockchip/rockchip_canfd-core.c:770:20: 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]
> > > >     770 |         .ndo_start_xmit = rkcanfd_start_xmit,
> > > >         |                           ^~~~~~~~~~~~~~~~~~
> > > > 
> > > > ->ndo_start_xmit() in 'struct net_device_ops' expects a return type of
> > > > 'netdev_tx_t', not 'int' (although the types are ABI compatible). Adjust
> > > > the return type of rkcanfd_start_xmit() to match the prototype's to
> > > > resolve the warning.
> > > > 
> > > > Fixes: ff60bfbaf67f ("can: rockchip_canfd: add driver for Rockchip CAN-FD controller")
> > > > Signed-off-by: Nathan Chancellor <nathan at kernel.org>
> > > 
> > > Thanks, I was able to reproduce this problem at build time
> > > and that your patch addresses it.
> > 
> > FTR: the default clang in Debian unstable, clang-16.0.6 doesn't support
> > this. With clang-20 from experimental it works, haven't checked older
> > versions, though.
> 
> FTR: I checked using 18.1.8 from here [1][2].
> 
> [1] https://mirrors.edge.kernel.org/pub/tools/llvm/
> [2] https://mirrors.edge.kernel.org/pub/tools/llvm/files/

I was a bit hasty yesterday, clang-20 and W=1 produces these errors:

| include/linux/vmstat.h:517:36: error: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Werror,-Wenum-enum-conversion]
|   517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
|       |                               ~~~~~~~~~~~ ^ ~~~
| 1 error generated.

However I fail to reproduce the ndo_start_xmit problem. Even with 18.1.8
from kernel.org.


The following command (ARCH is unset, compiling x86 -> x86) produces the
above shown "vmstat.h" problems....

| $ make LLVM=1 LLVM_IAS=1 LLVM_SUFFIX=-20 drivers/net/can/rockchip/  W=1 CONFIG_WERROR=0

... but not the ndo_start_xmit problem.


Am I missing a vital .config option?

| $ grep "CLANG\|CFI" .config
| CONFIG_CC_IS_CLANG=y
| CONFIG_CLANG_VERSION=200000
| CONFIG_CFI_AUTO_DEFAULT=y
| CONFIG_FUNCTION_PADDING_CFI=11
| CONFIG_LTO_CLANG=y
| CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
| CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
| CONFIG_HAS_LTO_CLANG=y
| CONFIG_LTO_CLANG_THIN=y
| CONFIG_ARCH_SUPPORTS_CFI_CLANG=y
| CONFIG_ARCH_USES_CFI_TRAPS=y
| CONFIG_CFI_CLANG=y
| # CONFIG_CFI_PERMISSIVE is not set


V=1 gives this output:

|   clang-20 -Wp,-MMD,drivers/net/can/rockchip/.rockchip_canfd-core.o.d
|   -nostdinc -Iarch/x86/include -I./arch/x86/include/generated
|   -Iinclude -I./include -Iarch/x86/include/uapi
|   -I./arch/x86/include/generated/uapi -Iinclude/uapi
|   -I./include/generated/uapi -include include/linux/compiler-version.h
|   -include include/linux/kconfig.h -include
|   include/linux/compiler_types.h -D__KERNEL__
|   --target=x86_64-linux-gnu -fintegrated-as
|   -Werror=unknown-warning-option -Werror=ignored-optimization-argument
|   -Werror=option-ignored -Werror=unused-command-line-argument
|   -fmacro-prefix-map== -Wundef -DKBUILD_EXTRA_WARN1 -std=gnu11
|   -fshort-wchar -funsigned-char -fno-common -fno-PIE
|   -fno-strict-aliasing -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
|   -fcf-protection=branch -fno-jump-tables -m64 -falign-loops=1
|   -mno-80387 -mno-fp-ret-in-387 -mstack-alignment=8 -mskip-rax-setup
|   -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare
|   -fno-asynchronous-unwind-tables -mretpoline-external-thunk
|   -mindirect-branch-cs-prefix -mfunction-return=thunk-extern
|   -fpatchable-function-entry=11,11 -fno-delete-null-pointer-checks -O2
|   -fstack-protector-strong -fomit-frame-pointer
|   -fno-stack-clash-protection -fno-lto -flto=thin -fsplit-lto-unit
|   -fvisibility=hidden -fsanitize=kcfi -falign-functions=16
|   -fstrict-flex-arrays=3 -fno-strict-overflow -fno-stack-check -Wall
|   -Wundef -Werror=implicit-function-declaration -Werror=implicit-int
|   -Werror=return-type -Werror=strict-prototypes -Wno-format-security
|   -Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member
|   -Wmissing-declarations -Wmissing-prototypes -Wframe-larger-than=2048
|   -Wno-gnu -Wvla -Wno-pointer-sign -Wcast-function-type
|   -Wimplicit-fallthrough -Werror=date-time
|   -Werror=incompatible-pointer-types -Wenum-conversion -Wextra
|   -Wunused -Wmissing-format-attribute -Wmissing-include-dirs
|   -Wunused-const-variable -Wno-missing-field-initializers
|   -Wno-type-limits -Wno-shift-negative-value -Wno-sign-compare
|   -Wno-unused-parameter -g -gdwarf-5 -DDEBUG
|   -Idrivers/net/can/rockchip -Idrivers/net/can/rockchip -DMODULE
|   -DKBUILD_BASENAME='"rockchip_canfd_core"'
|   -DKBUILD_MODNAME='"rockchip_canfd"'
|   -D__KBUILD_MODNAME=kmod_rockchip_canfd -c -o
|   drivers/net/can/rockchip/rockchip_canfd-core.o
|   drivers/net/can/rockchip/rockchip_canfd-core.c
| In file included from drivers/net/can/rockchip/rockchip_canfd-core.c:25:
| In file included from drivers/net/can/rockchip/rockchip_canfd.h:11:
| In file included from include/linux/can/dev.h:18:
| In file included from include/linux/can/bittiming.h:9:
| In file included from include/linux/netdevice.h:38:
| In file included from include/net/net_namespace.h:43:
| In file included from include/linux/skbuff.h:17:
| In file included from include/linux/bvec.h:10:
| In file included from include/linux/highmem.h:8:
| In file included from include/linux/cacheflush.h:5:
| In file included from arch/x86/include/asm/cacheflush.h:5:
| In file included from include/linux/mm.h:2232:
| include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
|   517 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
|       |                               ~~~~~~~~~~~ ^ ~~~
| 1 warning generated.

regards,
Marc

-- 
Pengutronix e.K.                 | Marc Kleine-Budde          |
Embedded Linux                   | https://www.pengutronix.de |
Vertretung Nürnberg              | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-9   |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20240910/6d0909c2/attachment.sig>


More information about the linux-arm-kernel mailing list