From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Philip Pettersson <philip.pettersson@gmail.com>,
Eric Dumazet <edumazet@google.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.4 14/28] packet: fix race condition in packet_set_ring
Date: Fri, 9 Dec 2016 17:17:56 +0100 [thread overview]
Message-ID: <20161209161748.495746419@linuxfoundation.org> (raw)
In-Reply-To: <20161209161747.923205441@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philip Pettersson <philip.pettersson@gmail.com>
[ Upstream commit 84ac7260236a49c79eede91617700174c2c19b0c ]
When packet_set_ring creates a ring buffer it will initialize a
struct timer_list if the packet version is TPACKET_V3. This value
can then be raced by a different thread calling setsockopt to
set the version to TPACKET_V1 before packet_set_ring has finished.
This leads to a use-after-free on a function pointer in the
struct timer_list when the socket is closed as the previously
initialized timer will not be deleted.
The bug is fixed by taking lock_sock(sk) in packet_setsockopt when
changing the packet version while also taking the lock at the start
of packet_set_ring.
Fixes: f6fb8f100b80 ("af-packet: TPACKET_V3 flexible buffer implementation.")
Signed-off-by: Philip Pettersson <philip.pettersson@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
net/packet/af_packet.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3572,19 +3572,25 @@ packet_setsockopt(struct socket *sock, i
if (optlen != sizeof(val))
return -EINVAL;
- if (po->rx_ring.pg_vec || po->tx_ring.pg_vec)
- return -EBUSY;
if (copy_from_user(&val, optval, sizeof(val)))
return -EFAULT;
switch (val) {
case TPACKET_V1:
case TPACKET_V2:
case TPACKET_V3:
- po->tp_version = val;
- return 0;
+ break;
default:
return -EINVAL;
}
+ lock_sock(sk);
+ if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) {
+ ret = -EBUSY;
+ } else {
+ po->tp_version = val;
+ ret = 0;
+ }
+ release_sock(sk);
+ return ret;
}
case PACKET_RESERVE:
{
@@ -4067,6 +4073,7 @@ static int packet_set_ring(struct sock *
/* Added to avoid minimal code churn */
struct tpacket_req *req = &req_u->req;
+ lock_sock(sk);
/* Opening a Tx-ring is NOT supported in TPACKET_V3 */
if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) {
WARN(1, "Tx-ring is not supported.\n");
@@ -4148,7 +4155,6 @@ static int packet_set_ring(struct sock *
goto out;
}
- lock_sock(sk);
/* Detach socket from network */
spin_lock(&po->bind_lock);
@@ -4197,11 +4203,11 @@ static int packet_set_ring(struct sock *
if (!tx_ring)
prb_shutdown_retire_blk_timer(po, rb_queue);
}
- release_sock(sk);
if (pg_vec)
free_pg_vec(pg_vec, order, req->tp_block_nr);
out:
+ release_sock(sk);
return err;
}
next prev parent reply other threads:[~2016-12-09 16:18 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20161209161807epcas5p2a4f0544b5e462fc831c24de653b6785e@epcas5p2.samsung.com>
2016-12-09 16:17 ` [PATCH 4.4 00/28] 4.4.38-stable review Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 01/28] virtio-net: add a missing synchronize_net() Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 02/28] net: check dead netns for peernet2id_alloc() Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 03/28] ip6_tunnel: disable caching when the traffic class is inherited Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 04/28] net: sky2: Fix shutdown crash Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 05/28] af_unix: conditionally use freezable blocking calls in read Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 06/28] rtnetlink: fix FDB size computation Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 07/28] l2tp: fix racy SOCK_ZAPPED flag check in l2tp_ip{,6}_bind() Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 08/28] net: dsa: bcm_sf2: Ensure we re-negotiate EEE during after link change Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 09/28] net, sched: respect rcu grace period on cls destruction Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 10/28] net/sched: pedit: make sure that offset is valid Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 11/28] netlink: Call cb->done from a worker thread Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 12/28] netlink: Do not schedule work from sk_destruct Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 13/28] net/dccp: fix use-after-free in dccp_invalid_packet Greg Kroah-Hartman
2016-12-09 16:17 ` Greg Kroah-Hartman [this message]
2016-12-09 16:17 ` [PATCH 4.4 15/28] net: bcmgenet: Utilize correct struct device for all DMA operations Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 16/28] sh_eth: remove unchecked interrupts for RZ/A1 Greg Kroah-Hartman
2016-12-09 16:17 ` [PATCH 4.4 17/28] geneve: avoid use-after-free of skb->data Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 18/28] net: avoid signed overflows for SO_{SND|RCV}BUFFORCE Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 19/28] net: ping: check minimum size on ICMP header length Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 20/28] sparc32: Fix inverted invalid_frame_pointer checks on sigreturns Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 21/28] sparc64: Fix find_node warning if numa node cannot be found Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 22/28] sparc64: fix compile warning section mismatch in find_node() Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 23/28] Dont feed anything but regular iovecs to blk_rq_map_user_iov Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 24/28] constify iov_iter_count() and iter_is_iovec() Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 25/28] ipv6: Set skb->protocol properly for local output Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 26/28] ipv4: " Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 27/28] esp4: Fix integrity verification when ESN are used Greg Kroah-Hartman
2016-12-09 16:18 ` [PATCH 4.4 28/28] esp6: " Greg Kroah-Hartman
2016-12-09 18:22 ` [PATCH 4.4 00/28] 4.4.38-stable review Shuah Khan
2016-12-09 22:35 ` Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161209161748.495746419@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=philip.pettersson@gmail.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.