From patchwork Tue Feb 7 20:57:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Willem de Bruijn X-Patchwork-Id: 725335 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vHxVn6G9tz9s2Q for ; Wed, 8 Feb 2017 07:57:37 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="YKhxFwsQ"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932440AbdBGU5e (ORCPT ); Tue, 7 Feb 2017 15:57:34 -0500 Received: from mail-qt0-f194.google.com ([209.85.216.194]:35281 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932357AbdBGU52 (ORCPT ); Tue, 7 Feb 2017 15:57:28 -0500 Received: by mail-qt0-f194.google.com with SMTP id s58so20736951qtc.2 for ; Tue, 07 Feb 2017 12:57:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=rfsWJfHW83WcsOxfYktK/YjS4JS6f2hVW8a2Lttv1U4=; b=YKhxFwsQVAE6DnTVCEZNhjQ4WCFDZns5TcbSIlBQPfDdcsqlEwXnG8sbCib1xBNyl9 dYoLrexNLx9DTD/PjDdUsJyjzuIOL9n2Kcbme8yME8SRquL+UgMiKRQASzOz4TYTIlJi I3lIUit5xPQfC01YBqjQOPiXIYFm6admVlc15cu9ZlCwL9MppsjaDjxybr15jFG5xsmL VkrLhCLNUitkpaIw0vPN2kiRKTx0nDNIg5gHqs2cSb4CU35voLn5ZmWAXJY6cXhkiF9z S4C574stYs3uCKowZtlKe+UCGsqYs/L4G6pWjuKaCnfXscR03EWjqOgPpZbf7h0Zvu1F w8xA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=rfsWJfHW83WcsOxfYktK/YjS4JS6f2hVW8a2Lttv1U4=; b=fBzfSboOYK4KTw/ALXOXvu4lfiU2CeuI7h5adZgiVbGnV0LWIF2jqOemoYgP1AKjhG bEFy6zl8SC53FYEUfnyvYPbCnmBieSD0Mu4czfJi9h0cWznP8yMYS45oD064E/FUWLyG UYsmHXf3WZnvEQ+qv9tZyxSytZDuPrSgFtEbrB77zHESMppDAcCbvyfSfQYg/dmZTjiD apFnqgqc3+sAw4agJu1gyJOVRbfJpHJkC90Cvhd80a/JRfi+T6T28acqXjC7x6sAWLeR 8/ejAdWAivv+ZSqhQ2xURMQYfRdXpYNCW53qmgbLYeWBcp6FhB3DsyEGmOd9ptQ1Z33D NMBg== X-Gm-Message-State: AMke39ku3pEpoICqlz0pXMkf+9EpYSn8iY/suyz8oWLqs8yvdt8RISyvN1borPAXY9RKZw== X-Received: by 10.237.59.28 with SMTP id p28mr15760869qte.152.1486501047621; Tue, 07 Feb 2017 12:57:27 -0800 (PST) Received: from willemb1.nyc.corp.google.com ([100.101.212.14]) by smtp.gmail.com with ESMTPSA id f126sm4332847qkc.47.2017.02.07.12.57.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Feb 2017 12:57:26 -0800 (PST) From: Willem de Bruijn To: netdev@vger.kernel.org Cc: davem@davemloft.net, eric.dumazet@gmail.com, sowmini.varadhan@oracle.com, dvyukov@google.com, Willem de Bruijn Subject: [PATCH net 2/2] packet: round up linear to header len Date: Tue, 7 Feb 2017 15:57:21 -0500 Message-Id: <20170207205721.23207-3-willemdebruijn.kernel@gmail.com> X-Mailer: git-send-email 2.11.0.483.g087da7b7c-goog In-Reply-To: <20170207205721.23207-1-willemdebruijn.kernel@gmail.com> References: <20170207205721.23207-1-willemdebruijn.kernel@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Willem de Bruijn Link layer protocols may unconditionally pull headers, as Ethernet does in eth_type_trans. Ensure that the entire link layer header always lies in the skb linear segment. tpacket_snd has such a check. Extend this to packet_snd. Variable length link layer headers complicate the computation somewhat. Here skb->len may be smaller than dev->hard_header_len. Round up the linear length to be at least as long as the smallest of the two. Reported-by: Dmitry Vyukov Signed-off-by: Willem de Bruijn Acked-by: Eric Dumazet --- net/packet/af_packet.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 3d555c79a7b5..d56ee46b11fc 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -2755,7 +2755,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) struct virtio_net_hdr vnet_hdr = { 0 }; int offset = 0; struct packet_sock *po = pkt_sk(sk); - int hlen, tlen; + int hlen, tlen, linear; int extra_len = 0; /* @@ -2816,8 +2816,9 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) err = -ENOBUFS; hlen = LL_RESERVED_SPACE(dev); tlen = dev->needed_tailroom; - skb = packet_alloc_skb(sk, hlen + tlen, hlen, len, - __virtio16_to_cpu(vio_le(), vnet_hdr.hdr_len), + linear = __virtio16_to_cpu(vio_le(), vnet_hdr.hdr_len); + linear = max(linear, min_t(int, len, dev->hard_header_len)); + skb = packet_alloc_skb(sk, hlen + tlen, hlen, len, linear, msg->msg_flags & MSG_DONTWAIT, &err); if (skb == NULL) goto out_unlock;