Re: kernel BUG at lib/string.c:LINE! (6)
From: Dmitry Vyukov <dvyukov@google.com>
Date: 2020-12-23 11:26:17
Also in:
lkml, netfilter-devel
On Tue, Dec 22, 2020 at 11:07 PM Florian Westphal [off-list ref] wrote:
Linus Torvalds [off-list ref] wrote:quoted
On Tue, Dec 22, 2020 at 6:44 AM syzbot [off-list ref] wrote:quoted
The issue was bisected to: commit 2f78788b55ba ("ilog2: improve ilog2 for constant arguments")That looks unlikely, although possibly some constant folding improvement might make the fortify code notice something with it.quoted
detected buffer overflow in strlen ------------[ cut here ]------------ kernel BUG at lib/string.c:1149! Call Trace: strlen include/linux/string.h:325 [inline] strlcpy include/linux/string.h:348 [inline] xt_rateest_tg_checkentry+0x2a5/0x6b0 net/netfilter/xt_RATEEST.c:143Honestly, this just looks like the traditional bug in "strlcpy()".Yes, thats exactly what this is, no idea why the bisection points at ilog2 changes.
The end result is usually clear from the bisection log:
bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=1584f137500000
In this case it looks like the most common cause of diverted bisection -- interference from other kernel bugs, this __queue_work issue that happened on ilog2 commit: [03f4935135b9efeb780b970ba023c201f81cf4e6] checkpatch: fix unescaped left brace testing commit 03f4935135b9efeb780b970ba023c201f81cf4e6 with gcc (GCC) 8.1.0 all runs: crashed: kernel BUG at lib/string.c:LINE! # git bisect bad 03f4935135b9efeb780b970ba023c201f81cf4e6 Bisecting: 21 revisions left to test after this (roughly 5 steps) [2f78788b55baa3410b1ec91a576286abe1ad4d6a] ilog2: improve ilog2 for constant arguments testing commit 2f78788b55baa3410b1ec91a576286abe1ad4d6a with gcc (GCC) 8.1.0 run #0: crashed: WARNING in __queue_work # git bisect bad 2f78788b55baa3410b1ec91a576286abe1ad4d6a
quoted
That BSD function is complete garbage, exactly because it doesn't limit the source length. People tend to _think_ it does ("what's that size_t argument for?") but strlcpy() only limits the *destination* size, and the source is always read fully.Right, I'll send a patch shortly.