Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp1340018pxb; Fri, 20 Nov 2020 07:15:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJxWKvMc5h766T+AmF41GItziQV1AbUSMfzaaQQF1WGwaoC0mA1wOLY9WLxUrcYaqhzXIHzD X-Received: by 2002:a50:e786:: with SMTP id b6mr21490305edn.242.1605885324147; Fri, 20 Nov 2020 07:15:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605885324; cv=none; d=google.com; s=arc-20160816; b=ZJ+U8BdUksvmBr1mv+UzW9WjKI4aIWvJosnccsgKrWPc91lticoRzljVQ2F4dVs4uS S2s5j7dpfyYfxd2IsOJKGLaxJvyzNxxphqR43rvQC5pet+VN4XFLavVKzUd0ixO4KHcY XgVGCCd3W0iZa5xC7PxshSFlEKi25f4ePgfcJ7ty07qDXpDvHO/yV0UjjCpEuIuycPKJ A8jqx+GUmTvWX9mVnnn3Ff3wCyBLTuTjMFvVawZga33HTcOfc/9DGL/RErtQMOkAo/O4 N3oAoweveMTf56rHXPc/NwTrqOzhhIw3W7/wo0CVl4y4AAaRSoZJ08hXKmJ1wL/63a6J zPmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=hvcGaECqW0UuX0beDIID3HHh0hLn9+BNDmbN32C+lPg=; b=szlvL2jiSj64k4q08Y9DsRx+AOjhQntTXRlKpQqC9KUBJRMLPP3VShlcjC/4ErzvEN ZWPdOoBXAYAD0/2LWsKj0lreGTY1wdf3X6tkoEz9VO4neC2ZeKDRF4CJhlKoUUvkX/sZ 8p+4H5LWJv6gzrmyn8qYTe+6c4c4aIF7rozxkKGig7DoWOY5Q/Fn44pGaUmm9GbVbRqq 8O/Ux1uxu931gJV1GEfAijeefFhaVTENJa4DRzrpztmJRrUZCUpMF/2vBW2sUdZ6HOoP 69JSfMZWmWlDHEYKTrfTiHwTUxbnmCJGok9MITyOKSMCXMoSAS26tSKH6m+JYun9Gu7n 7QEg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jt2si478519ejb.552.2020.11.20.07.15.00; Fri, 20 Nov 2020 07:15:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729148AbgKTPNc (ORCPT + 99 others); Fri, 20 Nov 2020 10:13:32 -0500 Received: from www62.your-server.de ([213.133.104.62]:46736 "EHLO www62.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729157AbgKTPNb (ORCPT ); Fri, 20 Nov 2020 10:13:31 -0500 Received: from sslproxy05.your-server.de ([78.46.172.2]) by www62.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1kg86F-0007x2-FN; Fri, 20 Nov 2020 16:13:23 +0100 Received: from [85.7.101.30] (helo=pc-9.home) by sslproxy05.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kg86F-0002nd-5k; Fri, 20 Nov 2020 16:13:23 +0100 Subject: Re: [PATCH] bpf: Check the return value of dev_get_by_index_rcu() To: xiakaixu1987@gmail.com, ast@kernel.org, kafai@fb.com, songliubraving@fb.com, yhs@fb.com, andrii@kernel.org, john.fastabend@gmail.com, kpsingh@chromium.org Cc: netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Kaixu Xia , dsahern@gmail.com References: <1605769468-2078-1-git-send-email-kaixuxia@tencent.com> From: Daniel Borkmann Message-ID: <65d8f988-5b41-24c2-8501-7cbbddb1238e@iogearbox.net> Date: Fri, 20 Nov 2020 16:13:22 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: <1605769468-2078-1-git-send-email-kaixuxia@tencent.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Authenticated-Sender: daniel@iogearbox.net X-Virus-Scanned: Clear (ClamAV 0.102.4/25994/Fri Nov 20 14:09:26 2020) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ +David ] On 11/19/20 8:04 AM, xiakaixu1987@gmail.com wrote: > From: Kaixu Xia > > The return value of dev_get_by_index_rcu() can be NULL, so here it > is need to check the return value and return error code if it is NULL. > > Signed-off-by: Kaixu Xia > --- > net/core/filter.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/net/core/filter.c b/net/core/filter.c > index 2ca5eecebacf..1263fe07170a 100644 > --- a/net/core/filter.c > +++ b/net/core/filter.c > @@ -5573,6 +5573,8 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, > struct net_device *dev; > > dev = dev_get_by_index_rcu(net, params->ifindex); > + if (unlikely(!dev)) > + return -EINVAL; > if (!is_skb_forwardable(dev, skb)) > rc = BPF_FIB_LKUP_RET_FRAG_NEEDED; The above logic is quite ugly anyway given we fetched the dev pointer already earlier in bpf_ipv{4,6}_fib_lookup() and now need to redo it again ... so yeah there could be a tiny race in here. We wanted do bring this logic closer to what XDP does anyway, something like below, for example. David, thoughts? Thx Subject: [PATCH] diff mtu check Signed-off-by: Daniel Borkmann --- net/core/filter.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/net/core/filter.c b/net/core/filter.c index 2ca5eecebacf..3bab0a97fa38 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5547,9 +5547,6 @@ static const struct bpf_func_proto bpf_xdp_fib_lookup_proto = { BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, struct bpf_fib_lookup *, params, int, plen, u32, flags) { - struct net *net = dev_net(skb->dev); - int rc = -EAFNOSUPPORT; - if (plen < sizeof(*params)) return -EINVAL; @@ -5559,25 +5556,16 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, switch (params->family) { #if IS_ENABLED(CONFIG_INET) case AF_INET: - rc = bpf_ipv4_fib_lookup(net, params, flags, false); - break; + return bpf_ipv4_fib_lookup(dev_net(skb->dev), params, flags, + !skb_is_gso(skb)); #endif #if IS_ENABLED(CONFIG_IPV6) case AF_INET6: - rc = bpf_ipv6_fib_lookup(net, params, flags, false); - break; + return bpf_ipv6_fib_lookup(dev_net(skb->dev), params, flags, + !skb_is_gso(skb)); #endif } - - if (!rc) { - struct net_device *dev; - - dev = dev_get_by_index_rcu(net, params->ifindex); - if (!is_skb_forwardable(dev, skb)) - rc = BPF_FIB_LKUP_RET_FRAG_NEEDED; - } - - return rc; + return -EAFNOSUPPORT; } static const struct bpf_func_proto bpf_skb_fib_lookup_proto = { -- 2.21.0