linux/drivers/net
Xie He 597d2df941 drivers/net/wan/lapbether: Added needed_headroom and a skb->len check
[ Upstream commit c7ca03c216 ]

1. Added a skb->len check

This driver expects upper layers to include a pseudo header of 1 byte
when passing down a skb for transmission. This driver will read this
1-byte header. This patch added a skb->len check before reading the
header to make sure the header exists.

2. Changed to use needed_headroom instead of hard_header_len to request
necessary headroom to be allocated

In net/packet/af_packet.c, the function packet_snd first reserves a
headroom of length (dev->hard_header_len + dev->needed_headroom).
Then if the socket is a SOCK_DGRAM socket, it calls dev_hard_header,
which calls dev->header_ops->create, to create the link layer header.
If the socket is a SOCK_RAW socket, it "un-reserves" a headroom of
length (dev->hard_header_len), and assumes the user to provide the
appropriate link layer header.

So according to the logic of af_packet.c, dev->hard_header_len should
be the length of the header that would be created by
dev->header_ops->create.

However, this driver doesn't provide dev->header_ops, so logically
dev->hard_header_len should be 0.

So we should use dev->needed_headroom instead of dev->hard_header_len
to request necessary headroom to be allocated.

This change fixes kernel panic when this driver is used with AF_PACKET
SOCK_RAW sockets.

Call stack when panic:

[  168.399197] skbuff: skb_under_panic: text:ffffffff819d95fb len:20
put:14 head:ffff8882704c0a00 data:ffff8882704c09fd tail:0x11 end:0xc0
dev:veth0
...
[  168.399255] Call Trace:
[  168.399259]  skb_push.cold+0x14/0x24
[  168.399262]  eth_header+0x2b/0xc0
[  168.399267]  lapbeth_data_transmit+0x9a/0xb0 [lapbether]
[  168.399275]  lapb_data_transmit+0x22/0x2c [lapb]
[  168.399277]  lapb_transmit_buffer+0x71/0xb0 [lapb]
[  168.399279]  lapb_kick+0xe3/0x1c0 [lapb]
[  168.399281]  lapb_data_request+0x76/0xc0 [lapb]
[  168.399283]  lapbeth_xmit+0x56/0x90 [lapbether]
[  168.399286]  dev_hard_start_xmit+0x91/0x1f0
[  168.399289]  ? irq_init_percpu_irqstack+0xc0/0x100
[  168.399291]  __dev_queue_xmit+0x721/0x8e0
[  168.399295]  ? packet_parse_headers.isra.0+0xd2/0x110
[  168.399297]  dev_queue_xmit+0x10/0x20
[  168.399298]  packet_sendmsg+0xbf0/0x19b0
......

Cc: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Cc: Martin Schiller <ms@dev.tdt.de>
Cc: Brian Norris <briannorris@chromium.org>
Signed-off-by: Xie He <xie.he.0141@gmail.com>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-08-19 08:15:03 +02:00
..
appletalk
arcnet arcnet: provide a buffer big enough to actually receive packets 2019-10-05 13:09:26 +02:00
bonding bonding: check return value of register_netdevice() in bond_newlink() 2020-07-29 10:16:51 +02:00
caif caif-hsi: fix possible deadlock in cfhsi_exit_module() 2019-07-28 08:29:23 +02:00
can slcan: Don't transmit uninitialized stack data in padding 2020-04-13 10:45:08 +02:00
dsa net: dsa: rtl8366: Fix VLAN set-up 2020-08-19 08:15:00 +02:00
ethernet fsl/fman: fix eth hash table allocation 2020-08-19 08:15:02 +02:00
fddi
fjes fjes: fix missed check in fjes_acpi_add 2019-12-31 16:34:36 +01:00
hamradio yam: fix possible memory leak in yam_init_driver 2020-06-25 15:32:51 +02:00
hippi hippi: Fix a size used in a 'pci_free_consistent()' in an error handling path 2020-07-29 10:16:48 +02:00
hyperv hv_netvsc: do not use VF device if link is down 2020-08-11 15:32:34 +02:00
ieee802154 ieee802154: fix one possible memleak in adf7242_probe 2020-07-29 10:16:49 +02:00
ipvlan ipvlan: don't deref eth hdr before checking it's set 2020-03-18 07:14:12 +01:00
netdevsim
phy net: dp83640: fix SIOCSHWTSTAMP to update the struct with actual configuration 2020-07-29 10:16:49 +02:00
plip
ppp pppoe: only process PADT targeted at local interfaces 2020-05-20 08:18:36 +02:00
slip slip: not call free_netdev before rtnl_unlock in slip_open 2020-03-20 11:55:54 +01:00
team team: fix hang in team_mode_get() 2020-04-29 16:31:22 +02:00
usb net: lan78xx: replace bogus endpoint lookup 2020-08-11 15:32:34 +02:00
vmxnet3 net: vmxnet3: fix possible buffer overflow caused by bad DMA value in vmxnet3_get_rss() 2020-06-22 09:05:12 +02:00
wan drivers/net/wan/lapbether: Added needed_headroom and a skb->len check 2020-08-19 08:15:03 +02:00
wimax wimax/i2400m: Fix potential urb refcnt leak 2020-05-10 10:30:08 +02:00
wireless wl1251: fix always return 0 error 2020-08-19 08:15:01 +02:00
xen-netback net: xen-netback: fix return type of ndo_start_xmit function 2019-11-24 08:19:18 +01:00
dummy.c
eql.c
geneve.c geneve: change from tx_error to tx_dropped on missing metadata 2020-06-25 15:33:02 +02:00
gtp.c gtp: set NLM_F_MULTI flag in gtp_genl_dump_pdp() 2020-05-27 17:37:33 +02:00
ifb.c
Kconfig geneve: change NET_UDP_TUNNEL dependency to select 2019-12-05 09:21:10 +01:00
LICENSE.SRC
loopback.c
macsec.c net: macsec: preserve ingress frame ordering 2020-05-14 07:57:17 +02:00
macvlan.c macvlan: Skip loopback packets in RX handler 2020-06-22 09:05:19 +02:00
macvtap.c
Makefile net: Always descend into dsa/ 2019-05-25 18:23:19 +02:00
mdio.c
mii.c
net_failover.c net_failover: fixed rollback in net_failover_open() 2020-06-22 09:04:58 +02:00
netconsole.c
nlmon.c
ntb_netdev.c ntb_netdev: fix sleep time mismatch 2019-12-01 09:17:13 +01:00
rionet.c
sb1000.c
Space.c
sungem_phy.c
tap.c
thunderbolt.c net: thunderbolt: Unregister ThunderboltIP protocol handler when suspending 2019-06-15 11:54:07 +02:00
tun.c tun: correct header offsets in napi frags mode 2020-06-22 09:04:58 +02:00
veth.c veth: Adjust hard_start offset on redirect XDP frames 2020-06-22 09:05:17 +02:00
virtio_net.c virtio_net: fix lockdep warning on 32 bit 2020-05-20 08:18:37 +02:00
vrf.c vrf: Check skb for XFRM_TRANSFORMED flag 2020-04-29 16:31:23 +02:00
vsockmon.c
vxlan.c Revert "vxlan: fix tos value before xmit" 2020-08-11 15:32:35 +02:00
xen-netfront.c xen-netfront: fix potential deadlock in xennet_remove() 2020-08-05 10:06:05 +02:00