From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: * X-Spam-Status: No, score=1.7 required=3.0 tests=BIGNUM_EMAILS,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9871BC4360F for ; Thu, 4 Apr 2019 23:13:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4BF872183E for ; Thu, 4 Apr 2019 23:13:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=gmx.net header.i=@gmx.net header.b="KgV3PzOK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730769AbfDDXNK (ORCPT ); Thu, 4 Apr 2019 19:13:10 -0400 Received: from mout.gmx.net ([212.227.15.18]:57593 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729400AbfDDXNK (ORCPT ); Thu, 4 Apr 2019 19:13:10 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1554419583; bh=iDeKNbzUjmJBIa1dEE0h3ooWjFR/bKBMk+Dv0zg/lwk=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=KgV3PzOKqnCu1Mdghp1LXTPEIrZ4p0Xn7VtEP3UlXNlzHUj8ExJofCV5PA7smMUpc C+4zKMA6rcwsCMXI3LLuET44QcPdZEGjLRv8YaBN+jEgOO/YJKhNMsE3nAzwhR8gLK be3LWF7dp53UAAkPSgjgfOgD47DUBtLqGaB8spQM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [10.0.0.7] ([113.116.50.182]) by mail.gmx.com (mrgmx002 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MFdPZ-1h70Sh2nhN-00EhUc; Fri, 05 Apr 2019 01:13:03 +0200 Subject: Re: [bug report] chardev: code cleanup for __register_chrdev_region() To: Dan Carpenter Cc: linux-fsdevel@vger.kernel.org References: <20190404190828.GA28465@kadam> From: cgxu519 Message-ID: Date: Fri, 5 Apr 2019 07:13:00 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: <20190404190828.GA28465@kadam> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Content-Language: en-US X-Provags-ID: V03:K1:xCj5Y8iHFmTUTiArEfBeSEN/A8gUvLotglKhHcSMoHeMKBYC/VK wHy3i4Ii+J3J5PJCtys3I9Gat2ze+VrvgZw/xHegpYo24VSyW8B6ya/2qVw/n0TQdmXw8pE qUSUiAv72XT87Jdw9NuRRj0ssDcifDKXF03BrP3AF6gM4xVUZ1MNU7aHFqTrsAE4p/1xzCa cMFwpEmNJKN70gb7MZBSA== X-UI-Out-Filterresults: notjunk:1;V03:K0:CLh8yPO/1Us=:Eer2t2aqcp6qbytvUeb5os EpOXt0Pa8JMfPpZiFFmnlPltWMG8KcLd10NxLr6v3vIoKnUc5rE6jYRZpvCk4zFs6vFLjCHIv IR57IIpYUiADNjdZxUvCEhQ9mtrcA8Wc/7KdOY+mJ0I41PzgDaTGTqTcaSY6eOXBRkTP1kyev e9e2xCVdqTAhqusqHzUsu9f2CzKt8jlcJZJL8wDkSgQFkXvIDgCsFIkq3SI317NtaG8s+taQ/ qRLd9lPddujGdbq8JysoAUmJYkz33VEgaAaPveMB8nZSFSZQO1FS7Fz+v9+iR1MrepJm90FGA txFtBHiPQfN1mXxLgNle79GCzfXfRUcUi9IRoX64vnYQnunsuDqq1AqKA5pmvgsIybjl2eSDY vpK9eKu4q1PSccJxEgjHOaTO3PM3asK8kbrfGrTFzihUr9BG4evYGuPyOzyi9+YwE2MCs/07U NxFEhR/cKRQkm0FEsyWut7ILlBU+GAblMdVLquznzuAHbyUKzhu12xHoiV4Zrk//JBQat/owM 7r3VK0hu9Z+slNOkAW3KnkXwIZLoj0cGH8fMcqLSfzkNIeZSrY6ERYMn99Ki0AeN1j03KGJYy Vo8tInOdFlZi2SQQHmFzD7o9LHdWGztAo29rRIeyKJOS85AQWHEnbuOO6ysdGKVQHNcT8EFxc fntNU8uIiyN/bvkTjogjCwZa+0VzFesunT871LiCm6P3AFBeCuHl93WZ9M5lQ9yoKTDl5TzWe 96kpg7S4s6SP2kwIKfQwILlgu8uYgaoV/LsBrjtg2AAJbJdndhH/opwhS2bt7Rcryyrbp5su1 XcIQdwI88f9UQIR/LHBtrgu36ScQqhO3RcOYNsoMEFtAovbuR4C5t3gVbYdj5VLRMYmdnDp8W vv9a16VW6+z+m9p5kPxwX3c9DwD2gDoRd24G4rsvgwMP+5SuSxgnrM1FEwyp9GlQYeHXsJFZE hvP7mS9CwPQ== Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org On 4/5/19 3:08 AM, Dan Carpenter wrote: > Hello Chengguang Xu, > > The patch 4b0be5726032: "chardev: code cleanup for > __register_chrdev_region()" from Feb 15, 2019, leads to the following > static checker warning: > > fs/char_dev.c:167 __register_chrdev_region() > error: passing non negative 511 to ERR_PTR Hi Dan, Thanks for your report,=C2=A0 I would like to know how did you trigger thi= s? IIUC, in the case of allocating dynamic major will not fail from minor overlap check. Thanks, Chengguang. > > fs/char_dev.c > 96 static struct char_device_struct * > 97 __register_chrdev_region(unsigned int major, unsigned int basem= inor, > 98 int minorct, const char *name) > 99 { > 100 struct char_device_struct *cd, *curr, *prev =3D NULL; > 101 int ret =3D -EBUSY; > 102 int i; > 103 > 104 if (major >=3D CHRDEV_MAJOR_MAX) { > 105 pr_err("CHRDEV \"%s\" major requested (%u) is g= reater than the maximum (%u)\n", > 106 name, major, CHRDEV_MAJOR_MAX-1); > 107 return ERR_PTR(-EINVAL); > 108 } > 109 > 110 if (minorct > MINORMASK + 1 - baseminor) { > 111 pr_err("CHRDEV \"%s\" minor range requested (%u= -%u) is out of range of maximum range (%u-%u) for a single major\n", > 112 name, baseminor, baseminor + minorct - = 1, 0, MINORMASK); > 113 return ERR_PTR(-EINVAL); > 114 } > 115 > 116 cd =3D kzalloc(sizeof(struct char_device_struct), GFP_K= ERNEL); > 117 if (cd =3D=3D NULL) > 118 return ERR_PTR(-ENOMEM); > 119 > 120 mutex_lock(&chrdevs_lock); > 121 > 122 if (major =3D=3D 0) { > 123 ret =3D find_dynamic_major(); > 124 if (ret < 0) { > 125 pr_err("CHRDEV \"%s\" dynamic allocatio= n region is full\n", > 126 name); > 127 goto out; > 128 } > 129 major =3D ret; > ^^^^^^^^^^^ > "ret" is a major here. > > 130 } > 131 > 132 i =3D major_to_index(major); > 133 for (curr =3D chrdevs[i]; curr; prev =3D curr, curr =3D= curr->next) { > 134 if (curr->major < major) > 135 continue; > 136 > 137 if (curr->major > major) > 138 break; > 139 > 140 if (curr->baseminor + curr->minorct <=3D basemi= nor) > 141 continue; > 142 > 143 if (curr->baseminor >=3D baseminor + minorct) > 144 break; > 145 > 146 goto out; > > I don't completely understand how this loop works, but I guess we should > set "ret =3D -EBUSY;" before the goto out. > > 147 } > 148 > 149 cd->major =3D major; > 150 cd->baseminor =3D baseminor; > 151 cd->minorct =3D minorct; > 152 strlcpy(cd->name, name, sizeof(cd->name)); > 153 > 154 if (!prev) { > 155 cd->next =3D curr; > 156 chrdevs[i] =3D cd; > 157 } else { > 158 cd->next =3D prev->next; > 159 prev->next =3D cd; > 160 } > 161 > 162 mutex_unlock(&chrdevs_lock); > 163 return cd; > 164 out: > 165 mutex_unlock(&chrdevs_lock); > 166 kfree(cd); > 167 return ERR_PTR(ret); > ^^^ > Otherwise it leads to an Oops in the caller. > > 168 } > > regards, > dan carpenter