2021-02-10 01:27:56

by syzbot

[permalink] [raw]
Subject: UBSAN: shift-out-of-bounds in xprt_do_reserve

Hello,

syzbot found the following issue on:

HEAD commit: dd86e7fa Merge tag 'pci-v5.11-fixes-2' of git://git.kernel..
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=105930c4d00000
kernel config: https://syzkaller.appspot.com/x/.config?x=266a5362c89c8127
dashboard link: https://syzkaller.appspot.com/bug?extid=f3a0fa110fd630ab56c8
compiler: Debian clang version 11.0.1-2
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17ba3038d00000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=15cf0d64d00000

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: [email protected]

================================================================================
UBSAN: shift-out-of-bounds in net/sunrpc/xprt.c:658:14
shift exponent 536870976 is too large for 64-bit type 'unsigned long'
CPU: 1 PID: 8411 Comm: syz-executor902 Not tainted 5.11.0-rc6-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:79 [inline]
dump_stack+0x137/0x1be lib/dump_stack.c:120
ubsan_epilogue lib/ubsan.c:148 [inline]
__ubsan_handle_shift_out_of_bounds+0x432/0x4d0 lib/ubsan.c:395
xprt_calc_majortimeo net/sunrpc/xprt.c:658 [inline]
xprt_init_majortimeo net/sunrpc/xprt.c:686 [inline]
xprt_request_init net/sunrpc/xprt.c:1805 [inline]
xprt_do_reserve+0x751/0x770 net/sunrpc/xprt.c:1815
__rpc_execute+0x1e1/0xb00 net/sunrpc/sched.c:891
rpc_run_task+0x5a4/0x740 net/sunrpc/clnt.c:1140
rpc_call_sync net/sunrpc/clnt.c:1169 [inline]
rpc_ping net/sunrpc/clnt.c:2682 [inline]
rpc_create_xprt+0x2f3/0x700 net/sunrpc/clnt.c:477
rpc_create+0x5df/0x8a0 net/sunrpc/clnt.c:593
nfs_create_rpc_client+0x5a0/0x740 fs/nfs/client.c:536
nfs_init_client+0x53/0xf0 fs/nfs/client.c:653
nfs_init_server fs/nfs/client.c:692 [inline]
nfs_create_server+0x82d/0x2130 fs/nfs/client.c:996
nfs_try_get_tree+0x385/0x1040 fs/nfs/super.c:939
vfs_get_tree+0x86/0x270 fs/super.c:1496
do_new_mount fs/namespace.c:2881 [inline]
path_mount+0x17ad/0x2a00 fs/namespace.c:3211
do_mount fs/namespace.c:3224 [inline]
__do_sys_mount fs/namespace.c:3432 [inline]
__se_sys_mount+0x28c/0x320 fs/namespace.c:3409
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x43ef89
Code: 28 c3 e8 2a 14 00 00 66 2e 0f 1f 84 00 00 00 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffe0a856338 EFLAGS: 00000246 ORIG_RAX: 00000000000000a5
RAX: ffffffffffffffda RBX: 0030656c69662f2e RCX: 000000000043ef89
RDX: 0000000020fb5ffc RSI: 0000000020000080 RDI: 00000000200000c0
RBP: 0000000000402f70 R08: 000000002000a000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000403000
R13: 0000000000000000 R14: 00000000004ac018 R15: 0000000000400488
================================================================================


---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at [email protected].

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
syzbot can test patches for this issue, for details see:
https://goo.gl/tpsmEJ#testing-patches


2021-02-11 00:55:55

by Randy Dunlap

[permalink] [raw]
Subject: Re: UBSAN: shift-out-of-bounds in xprt_do_reserve

On 2/9/21 5:24 PM, syzbot wrote:
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit: dd86e7fa Merge tag 'pci-v5.11-fixes-2' of git://git.kernel..
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=105930c4d00000
> kernel config: https://syzkaller.appspot.com/x/.config?x=266a5362c89c8127
> dashboard link: https://syzkaller.appspot.com/bug?extid=f3a0fa110fd630ab56c8
> compiler: Debian clang version 11.0.1-2
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=17ba3038d00000
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=15cf0d64d00000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: [email protected]

#syz dup: UBSAN: shift-out-of-bounds in xprt_calc_majortimeo

> ================================================================================
> UBSAN: shift-out-of-bounds in net/sunrpc/xprt.c:658:14
> shift exponent 536870976 is too large for 64-bit type 'unsigned long'
> CPU: 1 PID: 8411 Comm: syz-executor902 Not tainted 5.11.0-rc6-syzkaller #0
> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
> Call Trace:
> __dump_stack lib/dump_stack.c:79 [inline]
> dump_stack+0x137/0x1be lib/dump_stack.c:120
> ubsan_epilogue lib/ubsan.c:148 [inline]
> __ubsan_handle_shift_out_of_bounds+0x432/0x4d0 lib/ubsan.c:395
> xprt_calc_majortimeo net/sunrpc/xprt.c:658 [inline]
> xprt_init_majortimeo net/sunrpc/xprt.c:686 [inline]


--
~Randy

2021-02-11 01:08:48

by Trond Myklebust

[permalink] [raw]
Subject: Re: UBSAN: shift-out-of-bounds in xprt_do_reserve

Hi Randy,

On Wed, 2021-02-10 at 16:52 -0800, Randy Dunlap wrote:
> On 2/9/21 5:24 PM, syzbot wrote:
> > Hello,
> >
> > syzbot found the following issue on:
> >
> > HEAD commit:    dd86e7fa Merge tag 'pci-v5.11-fixes-2' of
> > git://git.kernel..
> > git tree:       upstream
> > console output:
> > https://syzkaller.appspot.com/x/log.txt?x=105930c4d00000
> > kernel config: 
> > https://syzkaller.appspot.com/x/.config?x=266a5362c89c8127
> > dashboard link:
> > https://syzkaller.appspot.com/bug?extid=f3a0fa110fd630ab56c8
> > compiler:       Debian clang version 11.0.1-2
> > syz repro:     
> > https://syzkaller.appspot.com/x/repro.syz?x=17ba3038d00000
> > C reproducer:  
> > https://syzkaller.appspot.com/x/repro.c?x=15cf0d64d00000
> >
> > IMPORTANT: if you fix the issue, please add the following tag to
> > the commit:
> > Reported-by: [email protected]
>
> #syz dup: UBSAN: shift-out-of-bounds in xprt_calc_majortimeo
>
> > ===================================================================
> > =============
> > UBSAN: shift-out-of-bounds in net/sunrpc/xprt.c:658:14
> > shift exponent 536870976 is too large for 64-bit type 'unsigned
> > long'
> > CPU: 1 PID: 8411 Comm: syz-executor902 Not tainted 5.11.0-rc6-
> > syzkaller #0
> > Hardware name: Google Google Compute Engine/Google Compute Engine,
> > BIOS Google 01/01/2011
> > Call Trace:
> >  __dump_stack lib/dump_stack.c:79 [inline]
> >  dump_stack+0x137/0x1be lib/dump_stack.c:120
> >  ubsan_epilogue lib/ubsan.c:148 [inline]
> >  __ubsan_handle_shift_out_of_bounds+0x432/0x4d0 lib/ubsan.c:395
> >  xprt_calc_majortimeo net/sunrpc/xprt.c:658 [inline]
> >  xprt_init_majortimeo net/sunrpc/xprt.c:686 [inline]
>
>

So, firstly, this is a case of 'doctor it hurts when I do this...' so
it isn't a critcal issue. It is a case where garbage mount options
produces garbage timeout values.
However, more importantly, it is a case where we could easily be
checking these values once at mount time instead of adding runtime
checks that can end up being called several times per RPC call.

Cheers
Trond
--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
[email protected]