Re: 5.10.58 UBSAN from brcmf_sdio_dpc+0xa50/0x128c [brcmfmac]
From: Ryutaroh Matsumoto <hidden>
Date: 2021-08-18 09:41:38
Also in:
linux-wireless
Hi Arend, sorry for my late response, partly because compilation takes 10 hours on RPi4B... I did the same thing with version 5.10.59 and CLang 11 and got the same UBSAN.
quoted
If you enable CONFIG_DEBUG_INFO in your kernel .config and recompile brcmfmac you can load the module in gdb: gdb> add-symbol-file brcmfmac.ko [address] gdb> l *brcmf_sdio_dpc+0xa50 The [address] is not very important so just fill in a nice value. The 'l' command should provide the line number.Hi Ryutaroh, Meanwhile I did some digging in the brcmfmac driver and I think I found the location in brcmf_sdio_sendfromq() where we do a __skb_queue_tail(). So I looked at that and it does following: static inline void __skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk) { __skb_queue_before(list, (struct sk_buff *)list, newsk); } Your report seems to be coming from the cast that is done here, which is fine as long as sk_buff and sk_buff_head have the same members 'next' and 'prev' at the start, which is true today and hopefully forever ;-) I am inclined to say this is a false report. Can you please confirm the stack trace indeed points to brcmf_sdio_sendfromq() in your report.
Summary: I confirm that the stack trace indeed points to
brcmf_sdio_sendfromq(). The detail follows (you don't have to read it if
you believe in me :-)
If kernel version 5.10.x or 5.13.x is compiled with gcc 10, I have never seen
UBSAN. I wonder if CLang 11/12 tends to generate falsely positive UBSAN.
(gdb) add-symbol-file drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko 0x0
add symbol table from file "drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko" at
.text_addr = 0x0
(y or n) y
(gdb) l *brcmf_sdio_dpc+0xa50
warning: Could not find DWO CU drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.dwo(0x79060145b4b45807) referenced by CU at offset 0x394 [in module /usr/lib/debug/lib/modules/5.10.59-clang11debug/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko]
0x277a4 is at ./include/linux/skbuff.h:2016.
2011 ./include/linux/skbuff.h: No such file or directory.
Line 2016 of skbuff.h is __skb_insert in the next inline function:
static inline void __skb_queue_before(struct sk_buff_head *list,
struct sk_buff *next,
struct sk_buff *newsk)
{
__skb_insert(newsk, next->prev, next, list);
}
Then:
(gdb) l *brcmf_sdio_dpc+0xa43
0x27797 is at drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:2346.
2341 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c: No such file or directory.
The line 2346 is in the function brcmf_sdio_sendfromq().
Best regards, Ryutaroh