linux/net
Daniel Borkmann 4c672e4b42 ipv6: mld: fix add_grhead skb_over_panic for devs with large MTUs
It has been reported that generating an MLD listener report on
devices with large MTUs (e.g. 9000) and a high number of IPv6
addresses can trigger a skb_over_panic():

skbuff: skb_over_panic: text:ffffffff80612a5d len:3776 put:20
head:ffff88046d751000 data:ffff88046d751010 tail:0xed0 end:0xec0
dev:port1
 ------------[ cut here ]------------
kernel BUG at net/core/skbuff.c:100!
invalid opcode: 0000 [#1] SMP
Modules linked in: ixgbe(O)
CPU: 3 PID: 0 Comm: swapper/3 Tainted: G O 3.14.23+ #4
[...]
Call Trace:
 <IRQ>
 [<ffffffff80578226>] ? skb_put+0x3a/0x3b
 [<ffffffff80612a5d>] ? add_grhead+0x45/0x8e
 [<ffffffff80612e3a>] ? add_grec+0x394/0x3d4
 [<ffffffff80613222>] ? mld_ifc_timer_expire+0x195/0x20d
 [<ffffffff8061308d>] ? mld_dad_timer_expire+0x45/0x45
 [<ffffffff80255b5d>] ? call_timer_fn.isra.29+0x12/0x68
 [<ffffffff80255d16>] ? run_timer_softirq+0x163/0x182
 [<ffffffff80250e6f>] ? __do_softirq+0xe0/0x21d
 [<ffffffff8025112b>] ? irq_exit+0x4e/0xd3
 [<ffffffff802214bb>] ? smp_apic_timer_interrupt+0x3b/0x46
 [<ffffffff8063f10a>] ? apic_timer_interrupt+0x6a/0x70

mld_newpack() skb allocations are usually requested with dev->mtu
in size, since commit 72e09ad107 ("ipv6: avoid high order allocations")
we have changed the limit in order to be less likely to fail.

However, in MLD/IGMP code, we have some rather ugly AVAILABLE(skb)
macros, which determine if we may end up doing an skb_put() for
adding another record. To avoid possible fragmentation, we check
the skb's tailroom as skb->dev->mtu - skb->len, which is a wrong
assumption as the actual max allocation size can be much smaller.

The IGMP case doesn't have this issue as commit 57e1ab6ead
("igmp: refine skb allocations") stores the allocation size in
the cb[].

Set a reserved_tailroom to make it fit into the MTU and use
skb_availroom() helper instead. This also allows to get rid of
igmp_skb_size().

Reported-by: Wei Liu <lw1a2.jing@gmail.com>
Fixes: 72e09ad107 ("ipv6: avoid high order allocations")
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Cc: David L Stevens <david.stevens@oracle.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-11-05 22:12:30 -05:00
..
6lowpan 6lowpan: Allow 6LoWPAN to be modular 2014-08-07 11:44:18 -07:00
9p 9p/trans_virtio: enable VQs early 2014-10-15 10:25:04 +10:30
802 net: set name_assign_type in alloc_netdev() 2014-07-15 16:12:48 -07:00
8021q net: better IFF_XMIT_DST_RELEASE support 2014-10-07 13:22:11 -04:00
appletalk net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
atm net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
ax25 net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
batman-adv batman-adv: replace strnicmp with strncasecmp 2014-10-14 02:18:24 +02:00
bluetooth net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
bridge Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-11-01 14:53:27 -04:00
caif net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
can can: add hash based access to single EFF frame filters 2014-05-19 09:38:24 +02:00
ceph Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client 2014-10-15 06:46:01 +02:00
core net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
dcb dcbnl : Fix misleading dcb_app->priority explanation 2014-07-30 17:21:05 -07:00
dccp net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
decnet af_decnet: Use time_after_eq 2014-08-22 12:23:11 -07:00
dns_resolver Merge commit 'v3.16' into next 2014-10-01 00:44:04 +10:00
dsa Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-11-01 14:53:27 -04:00
ethernet net: Add function for parsing the header length out of linear ethernet frames 2014-09-05 17:47:02 -07:00
hsr net/hsr: Remove left-over never-true conditional code. 2014-07-11 15:04:40 -07:00
ieee802154 net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
ipv4 ipv6: mld: fix add_grhead skb_over_panic for devs with large MTUs 2014-11-05 22:12:30 -05:00
ipv6 ipv6: mld: fix add_grhead skb_over_panic for devs with large MTUs 2014-11-05 22:12:30 -05:00
ipx net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
irda net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
iucv net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
key net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
l2tp net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
lapb lapb: move EXPORT_SYMBOL after functions. 2014-10-24 15:51:42 -04:00
llc net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
mac80211 mac80211: minstrels: fix buffer overflow in HT debugfs rc_stats 2014-10-20 16:37:01 +02:00
mac802154 Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2014-10-08 21:40:54 -04:00
mpls mpls: Allow mpls_gso to be built as module 2014-10-31 15:47:21 -04:00
netfilter ipvs: Avoid null-pointer deref in debug code 2014-10-28 09:48:31 +09:00
netlabel netlabel: kernel-doc warning fix 2014-10-09 01:40:05 -04:00
netlink net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
netrom net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
nfc net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
openvswitch openvswitch: Export lockdep_ovsl_is_held to modules. 2014-10-28 17:27:23 -04:00
packet net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
phonet net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
rds Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 2014-10-18 09:31:37 -07:00
rfkill net: rfkill: kernel-doc warning fixes 2014-10-09 11:16:15 +02:00
rose net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
rxrpc net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
sched net: add rbnode to struct sk_buff 2014-11-03 16:13:03 -05:00
sctp net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
sunrpc Merge branch 'for-3.18' of git://linux-nfs.org/~bfields/linux 2014-10-08 12:51:44 -04:00
tipc net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
unix net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
vmw_vsock net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
wimax wimax: convert printk to pr_foo() 2014-10-07 20:28:44 -04:00
wireless Here are a few fixes for the wireless stack: one fixes the 2014-10-27 13:38:15 -04:00
x25 net: Add and use skb_copy_datagram_msg() helper. 2014-11-05 16:46:40 -05:00
xfrm net: skb_fclone_busy() needs to detect orphaned skb 2014-10-30 19:58:30 -04:00
compat.c net: sendmsg: fix NULL pointer dereference 2014-07-29 12:20:22 -07:00
Kconfig bpf: split eBPF out of NET 2014-10-27 19:09:59 -04:00
Makefile 6lowpan: introduce new net/6lowpan directory 2014-07-12 01:53:30 +02:00
nonet.c
socket.c File locking related changes for v3.18 (pile #1) 2014-10-11 13:21:34 -04:00
sysctl_net.c