Received: by 2002:a05:6358:700f:b0:131:369:b2a3 with SMTP id 15csp1745349rwo; Wed, 2 Aug 2023 21:26:54 -0700 (PDT) X-Google-Smtp-Source: APBJJlGI2Jq1w4+2sb9oSyXvIM6u3DxH1KB3R1q0zxVQJowbwF9Jyzsb0XZlbek6NmdH6GoZDVhv X-Received: by 2002:a05:6358:9894:b0:139:688e:c73e with SMTP id q20-20020a056358989400b00139688ec73emr6167148rwa.32.1691036814247; Wed, 02 Aug 2023 21:26:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691036814; cv=none; d=google.com; s=arc-20160816; b=z/cXKoUsHt9tGz6FO4beFB9nlpo6OAYn7zJ7fSnZgvM5nDwmsS28nAZixg3EJEwJr5 udnzoDJf1gv1vk/VXo8HTxxoN5zERTzkbQgh658Ii+wXJT2YfRj4NrVwCh/527AS+v6w rKyPDwTPGyQ6MPDHM6rG5II1Up0hIUQ70PZ648gbr8A68Ap/YVYLOQGTRBZ2yO1jiyXt vcFvB+W34L/0B7TH9ywyeYqrZKTxAfpL6grsB9+lrLbpT6YzggkzmT97YRxyH0fff6ln thmD6bBEoVVlw0OqzFIrgRL0Ay42d3pJOo13FEE9cKF7sA3bR/my+ggtnw3CGZnT3Bet RJrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from:cc:to :content-language:subject:user-agent:mime-version:date:message-id; bh=pK13RgHVt3GvzgvVbJSrao1aAWESIQKv7+9lt2G517Y=; fh=NvdykMhnx2gUu8JvYYoPMHkAwaQ81Jh05plKfa7oycc=; b=RFI4q9a8AGyca54FOS27a1biswEboi+prflyYxV0dCui/E7WzPo8q1WXPsTJDSYitK ENlsjuaezO6CZvVBgTykQXpZtt9dkd3DjddZG/33Fq0PXAmlS/1FQZStomfEXTD/n9QG pKqlFmnmMf23NWV4r7xTCocQNE2BZUU9BKJFNTZg5DzcH91oMabRB7CreqKKjg3y7d6U geOV75M9LvWmiewOvVnwDt7oM01FQqbRtfJ7+sSHNwqgrmDj+r5lGyHE2h5OzYa86Pwi qpUXpU/Nk0qzwe+f2qinczHJwkwjiWHHZleVBbLNXK6497Mng5b2ubiWGtt36QNDWrwD WggA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w33-20020a634761000000b0055baeced15esi11630116pgk.549.2023.08.02.21.26.34; Wed, 02 Aug 2023 21:26:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230150AbjHCEQq (ORCPT + 99 others); Thu, 3 Aug 2023 00:16:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37744 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229944AbjHCEQp (ORCPT ); Thu, 3 Aug 2023 00:16:45 -0400 Received: from mail.nfschina.com (unknown [42.101.60.195]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 0FB4B2D68; Wed, 2 Aug 2023 21:16:43 -0700 (PDT) Received: from [172.30.11.106] (unknown [180.167.10.98]) by mail.nfschina.com (Maildata Gateway V2.8.8) with ESMTPSA id CF89060863210; Thu, 3 Aug 2023 12:16:40 +0800 (CST) Message-ID: <18edc2c7-2fb0-493b-9a9f-549acce4e87a@nfschina.com> Date: Thu, 3 Aug 2023 12:16:40 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: [PATCH] fs: lockd: avoid possible wrong NULL parameter Content-Language: en-US To: Nick Desaulniers , Dan Carpenter Cc: chuck.lever@oracle.com, jlayton@kernel.org, neilb@suse.de, kolga@netapp.com, Dai.Ngo@oracle.com, tom@talpey.com, trond.myklebust@hammerspace.com, anna@kernel.org, nathan@kernel.org, trix@redhat.com, bfields@fieldses.org, linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev, kernel-janitors@vger.kernel.org X-MD-Sfrom: suhui@nfschina.com X-MD-SrcIP: 180.167.10.98 From: Su Hui In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,RDNS_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On 2023/8/3 05:40, Nick Desaulniers wrote: > On Wed, Aug 2, 2023 at 3:25 AM Dan Carpenter wrote: > I noticed that the function in question already has a guard: > 322 if (hostname && memchr(hostname, '/', hostname_len) != NULL) { > > Which implies that hostname COULD be NULL. > > Should this perhaps simply be rewritten as: > > if (!hostname) > return NULL; > if (memchr(...) != NULL) > ... > > Rather than bury yet another guard for the same check further down in > the function? Check once and bail early. Hi, Nick Desaulnier, This may disrupt the logic of this function. So maybe the past one is better. 322 if (!hostname) 323 return NULL; ^^^^^^^^^^^^ If we return in this place. 324 if (memchr(hostname, '/', hostname_len) != NULL) { 325 if (printk_ratelimit()) { 326 printk(KERN_WARNING "Invalid hostname \"%.*s\" " 327 "in NFS lock request\n", 328 (int)hostname_len, hostname); 329 } 330 return NULL; 331 } 332 333 retry: 334 spin_lock(&nsm_lock); 335 336 if (nsm_use_hostnames && hostname != NULL) 337 cached = nsm_lookup_hostname(&ln->nsm_handles, 338 hostname, hostname_len); 339 else 340 cached = nsm_lookup_addr(&ln->nsm_handles, sap); ^^^^^^^^^^^^^^^ This case will be broken when hostname is NULL. 341 342 if (cached != NULL) { 343 refcount_inc(&cached->sm_count); 344 spin_unlock(&nsm_lock); 345 kfree(new); 346 dprintk("lockd: found nsm_handle for %s (%s), " 347 "cnt %d\n", cached->sm_name, 348 cached->sm_addrbuf, 349 refcount_read(&cached->sm_count)); 350 return cached; 351 } >> I noticed a related bug which Smatch doesn't find, because of how Smatch >> handles the dprintk macro. Hi, Dan, Great eye! Should I send a separate patch for this bug and add you as Reported-by ? >> >> fs/lockd/host.c >> truct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, >> 217 const size_t salen, >> 218 const unsigned short protocol, >> 219 const u32 version, >> 220 const char *hostname, >> 221 int noresvport, >> 222 struct net *net, >> 223 const struct cred *cred) >> 224 { >> 225 struct nlm_lookup_host_info ni = { >> 226 .server = 0, >> 227 .sap = sap, >> 228 .salen = salen, >> 229 .protocol = protocol, >> 230 .version = version, >> 231 .hostname = hostname, >> 232 .hostname_len = strlen(hostname), >> ^^^^^^^^ >> Dereferenced >> >> 233 .noresvport = noresvport, >> 234 .net = net, >> 235 .cred = cred, >> 236 }; >> 237 struct hlist_head *chain; >> 238 struct nlm_host *host; >> 239 struct nsm_handle *nsm = NULL; >> 240 struct lockd_net *ln = net_generic(net, lockd_net_id); >> 241 >> 242 dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__, >> 243 (hostname ? hostname : ""), version, >> ^^^^^^^^ >> Checked too late. >> >> 244 (protocol == IPPROTO_UDP ? "udp" : "tcp")); >> 245 >> >> regards, >> dan carpenter > >