projects
/
platform
/
kernel
/
linux-exynos.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
9538132
)
ping: fix a null pointer dereference
author
WANG Cong
<xiyou.wangcong@gmail.com>
Tue, 7 Feb 2017 20:59:46 +0000
(12:59 -0800)
committer
David S. Miller
<davem@davemloft.net>
Wed, 8 Feb 2017 18:58:21 +0000
(13:58 -0500)
Andrey reported a kernel crash:
general protection fault: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
(ftrace buffer empty)
Modules linked in:
CPU: 2 PID: 3880 Comm: syz-executor1 Not tainted 4.10.0-rc6+ #124
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
task:
ffff880060048040
task.stack:
ffff880069be8000
RIP: 0010:ping_v4_push_pending_frames net/ipv4/ping.c:647 [inline]
RIP: 0010:ping_v4_sendmsg+0x1acd/0x23f0 net/ipv4/ping.c:837
RSP: 0018:
ffff880069bef8b8
EFLAGS:
00010206
RAX:
dffffc0000000000
RBX:
ffff880069befb90
RCX:
0000000000000000
RDX:
0000000000000018
RSI:
ffff880069befa30
RDI:
00000000000000c2
RBP:
ffff880069befbb8
R08:
0000000000000008
R09:
0000000000000000
R10:
0000000000000002
R11:
0000000000000000
R12:
ffff880069befab0
R13:
ffff88006c624a80
R14:
ffff880069befa70
R15:
0000000000000000
FS:
00007f6f7c716700
(0000) GS:
ffff88006de00000
(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
00000000004a6f28
CR3:
000000003a134000
CR4:
00000000000006e0
Call Trace:
inet_sendmsg+0x164/0x5b0 net/ipv4/af_inet.c:744
sock_sendmsg_nosec net/socket.c:635 [inline]
sock_sendmsg+0xca/0x110 net/socket.c:645
SYSC_sendto+0x660/0x810 net/socket.c:1687
SyS_sendto+0x40/0x50 net/socket.c:1655
entry_SYSCALL_64_fastpath+0x1f/0xc2
This is because we miss a check for NULL pointer for skb_peek() when
the queue is empty. Other places already have the same check.
Fixes:
c319b4d76b9e
("net: ipv4: add IPPROTO_ICMP socket kind")
Reported-by: Andrey Konovalov <andreyknvl@google.com>
Tested-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ping.c
patch
|
blob
|
history
diff --git
a/net/ipv4/ping.c
b/net/ipv4/ping.c
index
86cca61
..
68d77b1
100644
(file)
--- a/
net/ipv4/ping.c
+++ b/
net/ipv4/ping.c
@@
-642,6
+642,8
@@
static int ping_v4_push_pending_frames(struct sock *sk, struct pingfakehdr *pfh,
{
struct sk_buff *skb = skb_peek(&sk->sk_write_queue);
+ if (!skb)
+ return 0;
pfh->wcheck = csum_partial((char *)&pfh->icmph,
sizeof(struct icmphdr), pfh->wcheck);
pfh->icmph.checksum = csum_fold(pfh->wcheck);