From patchwork Fri Mar 31 14:14:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 745664 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 3vvk5t6WHCz9ryr for ; Sat, 1 Apr 2017 01:14:42 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="dA+BFr/a"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933080AbdCaOOl (ORCPT ); Fri, 31 Mar 2017 10:14:41 -0400 Received: from mail-pg0-f54.google.com ([74.125.83.54]:36855 "EHLO mail-pg0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754688AbdCaOOP (ORCPT ); Fri, 31 Mar 2017 10:14:15 -0400 Received: by mail-pg0-f54.google.com with SMTP id g2so71563660pge.3 for ; Fri, 31 Mar 2017 07:14:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=inG9akqV8cLhL5i3lmnpnegdrm2tpFh6IlOUMboTQuk=; b=dA+BFr/a8JJ9jAJ6eOrdvvNxmO7tXJe2afsVFYnPQsYzRUcwm13o0nZ/UJxZrEs3MT C2C0Q0LoNvWXQPaPoZlNEymCL9N/UlPnCIBN+4HtZojDWU9/KlBKgZFsUic7Weqkq6fM q4J+wK80YlV9WxQ5p9VcK41ljagsKfDNhIdgk= 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=inG9akqV8cLhL5i3lmnpnegdrm2tpFh6IlOUMboTQuk=; b=lfW7Ji5CDW/aKfExhHsq88oLZzDpAqzOWOF5S//uQeOAoAXF0rE/PYa4B2fd94h9v4 aqxDTC+piToCx90X1xOJys0JU6OpjrYA7PHhBfSr8+aP6BrLIfbQsdvEc2rlSTdEYsoy hqHszUWO7rmf13SSM83k/16SWyBPL8f9cHdZQi8ABsHOQ2fmVoLi53BZPVybJV+BIPNb 1BgTDKGgjg9aWLNNgp9F6fykGb+oDkXB1K3uJGkW0E3Ad3F1IlzRUlcaTvYt0FToNgzx 8Z/Lq8qx9Gl56vai4XCn1bpYdTu7MfZWOCkf6B5sLiX5M6vGVv8b2nBFNDm/PF98cVVJ VYEg== X-Gm-Message-State: AFeK/H1PNCCZ2XFQb21w6yZN9CQhvIoZ5SlxmhREXbsOCUcCPsccRDryaBZ4h9Cm1zFbnVLO X-Received: by 10.98.63.140 with SMTP id z12mr3060800pfj.129.1490969654174; Fri, 31 Mar 2017 07:14:14 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id h14sm3985756pgn.64.2017.03.31.07.14.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 31 Mar 2017 07:14:13 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: roopa@cumulusnetworks.com, rshearma@brocade.com, ebiederm@xmission.com, David Ahern Subject: [PATCH net-next v3 4/6] net: mpls: Limit memory allocation for mpls_route Date: Fri, 31 Mar 2017 07:14:02 -0700 Message-Id: <1490969644-15499-5-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490969644-15499-1-git-send-email-dsa@cumulusnetworks.com> References: <1490969644-15499-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Limit memory allocation size for mpls_route to 4096. Signed-off-by: David Ahern --- v3 - no change v2 - new patch in v2 of set net/mpls/af_mpls.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 1863b94133e4..f84c52b6eafc 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c @@ -26,6 +26,9 @@ #define MAX_NEW_LABELS 2 +/* max memory we will use for mpls_route */ +#define MAX_MPLS_ROUTE_MEM 4096 + /* Maximum number of labels to look ahead at when selecting a path of * a multipath route */ @@ -477,14 +480,20 @@ static struct mpls_route *mpls_rt_alloc(u8 num_nh, u8 max_alen, u8 max_labels) { u8 nh_size = MPLS_NH_SIZE(max_labels, max_alen); struct mpls_route *rt; + size_t size; - rt = kzalloc(sizeof(*rt) + num_nh * nh_size, GFP_KERNEL); - if (rt) { - rt->rt_nhn = num_nh; - rt->rt_nhn_alive = num_nh; - rt->rt_nh_size = nh_size; - rt->rt_via_offset = MPLS_NH_VIA_OFF(max_labels); - } + size = sizeof(*rt) + num_nh * nh_size; + if (size > MAX_MPLS_ROUTE_MEM) + return ERR_PTR(-EINVAL); + + rt = kzalloc(size, GFP_KERNEL); + if (!rt) + return ERR_PTR(-ENOMEM); + + rt->rt_nhn = num_nh; + rt->rt_nhn_alive = num_nh; + rt->rt_nh_size = nh_size; + rt->rt_via_offset = MPLS_NH_VIA_OFF(max_labels); return rt; } @@ -898,8 +907,10 @@ static int mpls_route_add(struct mpls_route_config *cfg) err = -ENOMEM; rt = mpls_rt_alloc(nhs, max_via_alen, MAX_NEW_LABELS); - if (!rt) + if (IS_ERR(rt)) { + err = PTR_ERR(rt); goto errout; + } rt->rt_protocol = cfg->rc_protocol; rt->rt_payload_type = cfg->rc_payload_type; @@ -1970,7 +1981,7 @@ static int resize_platform_label_table(struct net *net, size_t limit) if (limit > MPLS_LABEL_IPV4NULL) { struct net_device *lo = net->loopback_dev; rt0 = mpls_rt_alloc(1, lo->addr_len, MAX_NEW_LABELS); - if (!rt0) + if (IS_ERR(rt0)) goto nort0; RCU_INIT_POINTER(rt0->rt_nh->nh_dev, lo); rt0->rt_protocol = RTPROT_KERNEL; @@ -1984,7 +1995,7 @@ static int resize_platform_label_table(struct net *net, size_t limit) if (limit > MPLS_LABEL_IPV6NULL) { struct net_device *lo = net->loopback_dev; rt2 = mpls_rt_alloc(1, lo->addr_len, MAX_NEW_LABELS); - if (!rt2) + if (IS_ERR(rt2)) goto nort2; RCU_INIT_POINTER(rt2->rt_nh->nh_dev, lo); rt2->rt_protocol = RTPROT_KERNEL;