Message ID | 1506955708.8061.5.camel@edumazet-glaptop3.roam.corp.google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Oct 02, 2017 at 07:48:28AM -0700, Eric Dumazet wrote: > Please try the following fool proof patch. > > This is what I had in my local tree back in August but could not > conclude on the syzkaller bug I was working on. Thanks, I'll give this a go shortly. I'm currently minimizing the Syzkaller log so that I can trigger the issue more quickly (and have some confidence in a Tested-by)! Thanks, Mark. > diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c > index 681e33998e03b609fdca83a83e0fc62a3fee8c39..e51d777797a927058760a1ab7af00579f7488cb5 100644 > --- a/net/ipv4/icmp.c > +++ b/net/ipv4/icmp.c > @@ -732,7 +732,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) > room = 576; > room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen; > room -= sizeof(struct icmphdr); > - > + if (room < 0) > + goto ende; > icmp_param.data_len = skb_in->len - icmp_param.offset; > if (icmp_param.data_len > room) > icmp_param.data_len = room; > > >
On Mon, Oct 02, 2017 at 07:48:28AM -0700, Eric Dumazet wrote: > Please try the following fool proof patch. > > This is what I had in my local tree back in August but could not > conclude on the syzkaller bug I was working on. > > diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c > index 681e33998e03b609fdca83a83e0fc62a3fee8c39..e51d777797a927058760a1ab7af00579f7488cb5 100644 > --- a/net/ipv4/icmp.c > +++ b/net/ipv4/icmp.c > @@ -732,7 +732,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) > room = 576; > room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen; > room -= sizeof(struct icmphdr); > - > + if (room < 0) > + goto ende; > icmp_param.data_len = skb_in->len - icmp_param.offset; > if (icmp_param.data_len > room) > icmp_param.data_len = room; > Unfortuantely, with this applied I still see the issue. Syzkaller came up with a minimized reproducer [1], which can trigger the issue near instantly under syz-execprog. If there's anything that would help to narrow this down, I'm more than happy to give it a go. Thanks, Mark. [1] https://www.kernel.org/pub/linux/kernel/people/mark/bugs/20171002-skb_clone-misaligned-atomic/syzkaller.repro
On Mon, Oct 2, 2017 at 10:21 AM, Mark Rutland <mark.rutland@arm.com> wrote: > On Mon, Oct 02, 2017 at 07:48:28AM -0700, Eric Dumazet wrote: >> Please try the following fool proof patch. >> >> This is what I had in my local tree back in August but could not >> conclude on the syzkaller bug I was working on. >> >> diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c >> index 681e33998e03b609fdca83a83e0fc62a3fee8c39..e51d777797a927058760a1ab7af00579f7488cb5 100644 >> --- a/net/ipv4/icmp.c >> +++ b/net/ipv4/icmp.c >> @@ -732,7 +732,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) >> room = 576; >> room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen; >> room -= sizeof(struct icmphdr); >> - >> + if (room < 0) >> + goto ende; >> icmp_param.data_len = skb_in->len - icmp_param.offset; >> if (icmp_param.data_len > room) >> icmp_param.data_len = room; >> > > Unfortuantely, with this applied I still see the issue. > > Syzkaller came up with a minimized reproducer [1], which can trigger the > issue near instantly under syz-execprog. If there's anything that would > help to narrow this down, I'm more than happy to give it a go. > > Thanks, > Mark. > > [1] https://www.kernel.org/pub/linux/kernel/people/mark/bugs/20171002-skb_clone-misaligned-atomic/syzkaller.repro Note that I was not trying to address the misaligned stuff. Only this : ------------[ cut here ]------------ kernel BUG at net/core/skbuff.c:2626! Internal error: Oops - BUG: 0 [#1] PREEMPT SMP Modules linked in: CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.14.0-rc2-00001-gd7ad33d #115 Hardware name: linux,dummy-virt (DT) task: ffff80003a901a80 task.stack: ffff80003a908000 PC is at skb_copy_and_csum_bits+0x8dc/0xae0 net/core/skbuff.c:2626 LR is at skb_copy_and_csum_bits+0x8dc/0xae0 net/core/skbuff.c:2626
On Mon, Oct 02, 2017 at 10:27:15AM -0700, Eric Dumazet wrote: > On Mon, Oct 2, 2017 at 10:21 AM, Mark Rutland <mark.rutland@arm.com> wrote: > > On Mon, Oct 02, 2017 at 07:48:28AM -0700, Eric Dumazet wrote: > >> Please try the following fool proof patch. > >> > >> This is what I had in my local tree back in August but could not > >> conclude on the syzkaller bug I was working on. > >> > >> diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c > >> index 681e33998e03b609fdca83a83e0fc62a3fee8c39..e51d777797a927058760a1ab7af00579f7488cb5 100644 > >> --- a/net/ipv4/icmp.c > >> +++ b/net/ipv4/icmp.c > >> @@ -732,7 +732,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) > >> room = 576; > >> room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen; > >> room -= sizeof(struct icmphdr); > >> - > >> + if (room < 0) > >> + goto ende; > >> icmp_param.data_len = skb_in->len - icmp_param.offset; > >> if (icmp_param.data_len > room) > >> icmp_param.data_len = room; > >> > > > > Unfortuantely, with this applied I still see the issue. > > > > Syzkaller came up with a minimized reproducer [1], which can trigger the > > issue near instantly under syz-execprog. If there's anything that would > > help to narrow this down, I'm more than happy to give it a go. > > > > Thanks, > > Mark. > > > > [1] https://www.kernel.org/pub/linux/kernel/people/mark/bugs/20171002-skb_clone-misaligned-atomic/syzkaller.repro > > Note that I was not trying to address the misaligned stuff. Aargh, I put the reproducer in the wrong folder thanks to tab-completing my kup command. :/ The reproducer linked above is for the kernel BUG at net/core/skbuff.c:2626. I've uploaded a copy into the relevant bug directory [1], but that'll take a little while to sync out. I'll drop it from the misalignment bug folder once that's visible to all. Sorry about that! Thanks, Mark. [1] https://www.kernel.org/pub/linux/kernel/people/mark/bugs/20171002-skbuff-bug/
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 681e33998e03b609fdca83a83e0fc62a3fee8c39..e51d777797a927058760a1ab7af00579f7488cb5 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -732,7 +732,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) room = 576; room -= sizeof(struct iphdr) + icmp_param.replyopts.opt.opt.optlen; room -= sizeof(struct icmphdr); - + if (room < 0) + goto ende; icmp_param.data_len = skb_in->len - icmp_param.offset; if (icmp_param.data_len > room) icmp_param.data_len = room;