From patchwork Mon Apr 15 17:52:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 1085854 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=herbertland.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=herbertland-com.20150623.gappssmtp.com header.i=@herbertland-com.20150623.gappssmtp.com header.b="WZtgSwX4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44jbgt3fBZz9s71 for ; Tue, 16 Apr 2019 03:52:58 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727753AbfDORw5 (ORCPT ); Mon, 15 Apr 2019 13:52:57 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:38767 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727691AbfDORwz (ORCPT ); Mon, 15 Apr 2019 13:52:55 -0400 Received: by mail-pl1-f194.google.com with SMTP id f36so8942948plb.5 for ; Mon, 15 Apr 2019 10:52:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=herbertland-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=saXVKYL9o8WFyFkFjV15f6EGlABvmjD7ESk09V1SVd8=; b=WZtgSwX4edQZ23kCPbAJMR1EpZgGWLRlUaPRyzdhtpjrw+izGVDSX0wSY7gl6fl5vR BM8qwHjqTgZyOVWkb/HMbTczNn4TFIIS6b0ZmjPtIgJpr5S1JHyt8TTzNwN2xC8sHTSF NgqPCprFVc/BSLrMBl/KDajCnzsdJrEjS+PRCO/s2rVqiMvfPPxLm97YeD1IOoC4uDhV ddcN1JfUYHeaELJLT/5rjNAEmXnj+EcjCxSjFuAbnA1woASVDGWLITy5cQcGSLC3uDBq cVaiKtN+/MwMMqUltWpK/epKBG2sH1YLyxYuUsAt5Vu3FUlxKloeL8ZNPnZQIor90ulT +qSg== 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=saXVKYL9o8WFyFkFjV15f6EGlABvmjD7ESk09V1SVd8=; b=S5Ya+iuDfr5l/a6gjfU6MjC0vypwENGGBWwaTZl3OEv9YbGZ/9Mw2vkDFR9ka0wWvA cTpormKky7Ur5+YnDFkkW/ArUqCV1pcHuyFbWv9XEGolgLb7DHwgHOHE4mTk8/KMpudq XNs6a39h1F7Z6C+KDNORWwg4qWjx/YgsmxRr79chrHme+drB7VuChyrCbiOeDtRXMko1 wduxQzJCLl63+VustelEo/Ldi7aZjdfBRsUv0cIwGs2ov2jDeQ0iyGNutx6opOQ7MJEL jM+HJlWlNTryLhlkcs6xnDd5XdqmHsdTLKHMSUBGu7kZLE2IeuBaOiaN92yb91ZZYkBS Azog== X-Gm-Message-State: APjAAAVDwHbQEvhzgnwJnMDfSF4LNhiZUR+Ca0TcOnwkkvlGpbjL7o3l ZFeitygUHVcg6niN0LJeXqc3OQ== X-Google-Smtp-Source: APXvYqzZGBdzV+kY1FqPgHiUxS3dIo+I6RWgcEVqzk3FO/NnO6sJH2n/Ie1kxeuALcm8wj6UOv8xnA== X-Received: by 2002:a17:902:110c:: with SMTP id d12mr49449165pla.47.1555350774634; Mon, 15 Apr 2019 10:52:54 -0700 (PDT) Received: from localhost.localdomain (c-73-223-249-119.hsd1.ca.comcast.net. [73.223.249.119]) by smtp.gmail.com with ESMTPSA id t24sm58751170pfe.110.2019.04.15.10.52.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 15 Apr 2019 10:52:54 -0700 (PDT) From: Tom Herbert X-Google-Original-From: Tom Herbert To: davem@davemloft.net, netdev@vger.kernel.org Cc: Tom Herbert Subject: [PATCH v3 net-next 3/7] ipv6: Consolidate option cases in ip6_datagram_send_ctl Date: Mon, 15 Apr 2019 10:52:16 -0700 Message-Id: <1555350740-23490-4-git-send-email-tom@quantonium.net> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1555350740-23490-1-git-send-email-tom@quantonium.net> References: <1555350740-23490-1-git-send-email-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Consolidate cases for IPV6_2292HOPOPTS, IPV6_HOPOPTS, IPV6_2292DSTOPTS, IPV6_DSTOPTS, and IPV6_RTHDRDSTOPTS. Most of the work and verifications are common for all these case, individual differences in processing can be implemented with an embedded switch statement. --- net/ipv6/datagram.c | 66 ++++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index ee4a4e5..f4742db 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -842,49 +842,7 @@ int ip6_datagram_send_ctl(struct net *net, struct sock *sk, case IPV6_2292HOPOPTS: case IPV6_HOPOPTS: - if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { - err = -EINVAL; - goto exit_f; - } - - hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg); - len = ((hdr->hdrlen + 1) << 3); - if (cmsg->cmsg_len < CMSG_LEN(len)) { - err = -EINVAL; - goto exit_f; - } - if (!ns_capable(net->user_ns, CAP_NET_RAW)) { - err = -EPERM; - goto exit_f; - } - opt->opt_nflen += len; - opt->hopopt = hdr; - break; - case IPV6_2292DSTOPTS: - if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { - err = -EINVAL; - goto exit_f; - } - - hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg); - len = ((hdr->hdrlen + 1) << 3); - if (cmsg->cmsg_len < CMSG_LEN(len)) { - err = -EINVAL; - goto exit_f; - } - if (!ns_capable(net->user_ns, CAP_NET_RAW)) { - err = -EPERM; - goto exit_f; - } - if (opt->dst1opt) { - err = -EINVAL; - goto exit_f; - } - opt->opt_flen += len; - opt->dst1opt = hdr; - break; - case IPV6_DSTOPTS: case IPV6_RTHDRDSTOPTS: if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { @@ -902,13 +860,33 @@ int ip6_datagram_send_ctl(struct net *net, struct sock *sk, err = -EPERM; goto exit_f; } - if (cmsg->cmsg_type == IPV6_DSTOPTS) { + + switch (cmsg->cmsg_type) { + case IPV6_2292HOPOPTS: + case IPV6_HOPOPTS: + if (opt->hopopt) { + err = -EINVAL; + goto exit_f; + } + opt->opt_nflen += len; + opt->hopopt = hdr; + break; + case IPV6_2292DSTOPTS: + if (opt->dst1opt) { + err = -EINVAL; + goto exit_f; + } + /* Fallthrough */ + case IPV6_DSTOPTS: opt->opt_flen += len; opt->dst1opt = hdr; - } else { + break; + case IPV6_RTHDRDSTOPTS: opt->opt_nflen += len; opt->dst0opt = hdr; + break; } + break; case IPV6_2292RTHDR: