From patchwork Thu Mar 30 16:18:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 745352 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 3vv8vM22qrz9s0g for ; Fri, 31 Mar 2017 03:18:39 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="bBdkr1MP"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934444AbdC3QSi (ORCPT ); Thu, 30 Mar 2017 12:18:38 -0400 Received: from mail-pg0-f48.google.com ([74.125.83.48]:36807 "EHLO mail-pg0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934406AbdC3QSf (ORCPT ); Thu, 30 Mar 2017 12:18:35 -0400 Received: by mail-pg0-f48.google.com with SMTP id g2so43890354pge.3 for ; Thu, 30 Mar 2017 09:18:34 -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=L+jF+AvqLonk9CLmkPrhIlILwtlvoBS3b6I/dke5c4o=; b=bBdkr1MP8WX4a1a8hD+zlfzIfHLfGav9HStIWDEX7CTKB8qvtKvIJkFyl68HTUbx8a X/4CeLlUjpURcMvfXH7Ts18APSsqLqaKAOglS98EOuZwvgRxzOo0f8Gzlc3/1x2MstkR rT8czSz5AoBOR7bTzxx2xuPO8v+J0tL6eW+eA= 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=L+jF+AvqLonk9CLmkPrhIlILwtlvoBS3b6I/dke5c4o=; b=t/WL7txwGo1i6sSwNAhL5WR1I5KZOYLF+lePWJKI04Tl7e+ax1isrt9ahjb5qfVw/U jrsgaQSzEyQ9lOzk+trFJAjKKh71t5Wqo9tUhPcWPUmVeEwtwF5HalLpER73TWK+5Io7 aucnm/xN17j2TbIQbhD4WCX2JaUakvyNm5Cz2LsbmyTpiJiionjyvivMvaxWlmQ6F3XS xV33JlY+344o5VCHDZAWyDvbBJWyLj8cNN0E+5z6CbqLYPVJdgHDDkkXaMplTrMzgKrF SK7CMQXzQq3ztgGjVczShvm/KqkJY0bvNN8+l0lB2V0B+OKqbo2Dg3zfZfGTNrVieAUj fysA== X-Gm-Message-State: AFeK/H0BGE5/8KCY/5jgn9jlqw7rpeLCGmnSHgxIE5ygAE9rT1LJ8otczX2Em+F0MaKvthq8 X-Received: by 10.98.9.29 with SMTP id e29mr507756pfd.101.1490890713953; Thu, 30 Mar 2017 09:18:33 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id h20sm5510174pfh.79.2017.03.30.09.18.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 30 Mar 2017 09:18:33 -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 v2 4/6] net: mpls: Limit memory allocation for mpls_route Date: Thu, 30 Mar 2017 09:18:22 -0700 Message-Id: <1490890704-8075-5-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490890704-8075-1-git-send-email-dsa@cumulusnetworks.com> References: <1490890704-8075-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 --- 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;