From patchwork Thu Jan 17 22:52:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1027032 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=netronome.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="HEI6hfJE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43gfWF11tsz9sBZ for ; Fri, 18 Jan 2019 09:53:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726906AbfAQWx1 (ORCPT ); Thu, 17 Jan 2019 17:53:27 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:46967 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726780AbfAQWxY (ORCPT ); Thu, 17 Jan 2019 17:53:24 -0500 Received: by mail-pg1-f195.google.com with SMTP id w7so5074700pgp.13 for ; Thu, 17 Jan 2019 14:53:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZRJMWn6qMKsRXqfOik9hcJp+f2eVLCPK9DifOBSLWKQ=; b=HEI6hfJEN7gVV+uVhHnTIkjtHT31C7mBKpTboeVsojWWAjyyCKhx2ecQfZ5nagE8hQ LnEbY6kqN68drrsxPncpTmVsC4KKKTmPsRu/QMhXgCXSnPdT4a3tQ8QifujRJpwtiTex VrH/OfNODrPte0nEBl4h4IpTwIhVan3E31r+kXV4q/VGhR8e9zKKvbw1QsZuwzizWj8G F+3lOwWCi+0NzRxDz+6CZx/qQXD16mzH0Vu3BMucxebeTNwtVbIxDqsxYAbLFUaoKSut LQtKWsYOUp6abmV25loh0DL1imvV4ZmaFSssUSmxMBC2enTVvzJ98IES2O9Lys/li6WO YVkQ== 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:mime-version:content-transfer-encoding; bh=ZRJMWn6qMKsRXqfOik9hcJp+f2eVLCPK9DifOBSLWKQ=; b=sQ23T2aHVaz9IWjKWBQEBrwVqNf5iDO2VUHYhSeMRGge4r1XjfoduTJrI5pQofOVDh K0MDQPKGYpZnpOg+IBr3qsT+iCNCukqx3P8qdNQdDDwJQLipluPnzXNtRwJtJmDJsYjz XgVZPcVlh6uu4j0nePV+T2YqbMInUVzYbbn3hITmI6GiBjhVH+UQ/CZniqt2pnKjGYpz h6glYVwyUF1zlNOoSfjWBzPauoZYG9UJ5R2LaTmnQsBp34/ngieRbkuiD94pg43dDWXt uiw8tGQpDHH2CL2DfdBxqnNoin5DzCP6SWj6nUOT6+VTA9+EWvg4z9z50vL4il4NwL2u YgTg== X-Gm-Message-State: AJcUukeUDOtR5XOjg5Xbk6mvfdNqg4fGI+B+nmredShnPIsEyGSwGEod 1B21D4oG1tF4TfS49KlihF7wF59T/fQ= X-Google-Smtp-Source: ALg8bN7mpKM4KKSOvlzHp/WSJPeuJRsnC61eyR0yL81Un43rPFJf2KgyPWQHG92cVHOm28vAwtBoKw== X-Received: by 2002:a63:990a:: with SMTP id d10mr15288468pge.279.1547765602796; Thu, 17 Jan 2019 14:53:22 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id j9sm3436324pfi.86.2019.01.17.14.53.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 Jan 2019 14:53:22 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net, dsahern@gmail.com Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jakub Kicinski Subject: [PATCH net-next 12/13] net: mpls: route: perform strict checks also for doit handlers Date: Thu, 17 Jan 2019 14:52:59 -0800 Message-Id: <20190117225300.8006-13-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190117225300.8006-1-jakub.kicinski@netronome.com> References: <20190117225300.8006-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Make RTM_GETROUTE's doit handler use strict checks when NETLINK_F_STRICT_CHK is set. Signed-off-by: Jakub Kicinski --- net/mpls/af_mpls.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 7d55d4c04088..733c86db551b 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -2236,6 +2236,64 @@ static void rtmsg_lfib(int event, u32 label, struct mpls_route *rt, rtnl_set_sk_err(net, RTNLGRP_MPLS_ROUTE, err); } +static int mpls_valid_getroute_req(struct sk_buff *skb, + const struct nlmsghdr *nlh, + struct nlattr **tb, + struct netlink_ext_ack *extack) +{ + struct rtmsg *rtm; + int i, err; + + if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) { + NL_SET_ERR_MSG_MOD(extack, + "Invalid header for get route request"); + return -EINVAL; + } + + if (!netlink_strict_get_check(skb)) + return nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, + rtm_mpls_policy, extack); + + rtm = nlmsg_data(nlh); + if ((rtm->rtm_dst_len && rtm->rtm_dst_len != 20) || + rtm->rtm_src_len || rtm->rtm_tos || rtm->rtm_table || + rtm->rtm_protocol || rtm->rtm_scope || rtm->rtm_type) { + NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for get route request"); + return -EINVAL; + } + if (rtm->rtm_flags & ~RTM_F_FIB_MATCH) { + NL_SET_ERR_MSG_MOD(extack, + "Invalid flags for get route request"); + return -EINVAL; + } + + err = nlmsg_parse_strict(nlh, sizeof(*rtm), tb, RTA_MAX, + rtm_mpls_policy, extack); + if (err) + return err; + + if ((tb[RTA_DST] || tb[RTA_NEWDST]) && !rtm->rtm_dst_len) { + NL_SET_ERR_MSG_MOD(extack, "rtm_dst_len must be 20 for MPLS"); + return -EINVAL; + } + + for (i = 0; i <= RTA_MAX; i++) { + if (!tb[i]) + continue; + + switch (i) { + case RTA_DST: + case RTA_NEWDST: + break; + default: + NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in get route request"); + return -EINVAL; + } + } + + return 0; +} + static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, struct netlink_ext_ack *extack) { @@ -2255,8 +2313,7 @@ static int mpls_getroute(struct sk_buff *in_skb, struct nlmsghdr *in_nlh, u8 n_labels; int err; - err = nlmsg_parse(in_nlh, sizeof(*rtm), tb, RTA_MAX, - rtm_mpls_policy, extack); + err = mpls_valid_getroute_req(in_skb, in_nlh, tb, extack); if (err < 0) goto errout;