[PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES

Phil Auld posted 1 patch 3 years, 7 months ago
include/linux/cpumask.h | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
[PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES
Posted by Phil Auld 3 years, 7 months ago
As PAGE_SIZE is unsigned long, -1 > PAGE_SIZE when NR_CPUS <= 3.
This leads to very large file sizes:

topology$ ls -l
total 0
-r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 core_cpus
-r--r--r-- 1 root root                 4096 Sep  5 11:59 core_cpus_list
-r--r--r-- 1 root root                 4096 Sep  5 10:58 core_id
-r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 core_siblings
-r--r--r-- 1 root root                 4096 Sep  5 11:59 core_siblings_list
-r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 die_cpus
-r--r--r-- 1 root root                 4096 Sep  5 11:59 die_cpus_list
-r--r--r-- 1 root root                 4096 Sep  5 11:59 die_id
-r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 package_cpus
-r--r--r-- 1 root root                 4096 Sep  5 11:59 package_cpus_list
-r--r--r-- 1 root root                 4096 Sep  5 10:58 physical_package_id
-r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 thread_siblings
-r--r--r-- 1 root root                 4096 Sep  5 11:59 thread_siblings_list

Adjust the inequality to catch the case when NR_CPUS is configured
to a small value.

Fixes: 7ee951acd31a ("drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist")
Reported-by: feng xiangjun <fengxj325@gmail.com>
Signed-off-by: Phil Auld <pauld@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Yury Norov <yury.norov@gmail.com>
Cc: stable@vger.kernel.org
Cc: feng xiangjun <fengxj325@gmail.com>
---

v2: Remove the +/-1 completely from the test since it will produce the
same results, and remove some extra parentheses.

 include/linux/cpumask.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index bd047864c7ac..e8ad12b5b9d2 100644
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -1127,9 +1127,10 @@ cpumap_print_list_to_buf(char *buf, const struct cpumask *mask,
  * cover a worst-case of every other cpu being on one of two nodes for a
  * very large NR_CPUS.
  *
- *  Use PAGE_SIZE as a minimum for smaller configurations.
+ *  Use PAGE_SIZE as a minimum for smaller configurations while avoiding
+ *  unsigned comparison to -1.
  */
-#define CPUMAP_FILE_MAX_BYTES  ((((NR_CPUS * 9)/32 - 1) > PAGE_SIZE) \
+#define CPUMAP_FILE_MAX_BYTES  (((NR_CPUS * 9)/32 > PAGE_SIZE) \
 					? (NR_CPUS * 9)/32 - 1 : PAGE_SIZE)
 #define CPULIST_FILE_MAX_BYTES  (((NR_CPUS * 7)/2 > PAGE_SIZE) ? (NR_CPUS * 7)/2 : PAGE_SIZE)
 
-- 
2.31.1
Re: [PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES
Posted by Yury Norov 3 years, 7 months ago
On Tue, Sep 06, 2022 at 04:35:42PM -0400, Phil Auld wrote:
> As PAGE_SIZE is unsigned long, -1 > PAGE_SIZE when NR_CPUS <= 3.
> This leads to very large file sizes:
> 
> topology$ ls -l
> total 0
> -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 core_cpus
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_cpus_list
> -r--r--r-- 1 root root                 4096 Sep  5 10:58 core_id
> -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 core_siblings
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_siblings_list
> -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 die_cpus
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_cpus_list
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_id
> -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 package_cpus
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 package_cpus_list
> -r--r--r-- 1 root root                 4096 Sep  5 10:58 physical_package_id
> -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 thread_siblings
> -r--r--r-- 1 root root                 4096 Sep  5 11:59 thread_siblings_list
> 
> Adjust the inequality to catch the case when NR_CPUS is configured
> to a small value.
> 
> Fixes: 7ee951acd31a ("drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist")
> Reported-by: feng xiangjun <fengxj325@gmail.com>
> Signed-off-by: Phil Auld <pauld@redhat.com>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: "Rafael J. Wysocki" <rafael@kernel.org>
> Cc: Yury Norov <yury.norov@gmail.com>
> Cc: stable@vger.kernel.org
> Cc: feng xiangjun <fengxj325@gmail.com>

Applied on bitmap-for-next. Thanks!

> ---
> 
> v2: Remove the +/-1 completely from the test since it will produce the
> same results, and remove some extra parentheses.
> 
>  include/linux/cpumask.h | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
> index bd047864c7ac..e8ad12b5b9d2 100644
> --- a/include/linux/cpumask.h
> +++ b/include/linux/cpumask.h
> @@ -1127,9 +1127,10 @@ cpumap_print_list_to_buf(char *buf, const struct cpumask *mask,
>   * cover a worst-case of every other cpu being on one of two nodes for a
>   * very large NR_CPUS.
>   *
> - *  Use PAGE_SIZE as a minimum for smaller configurations.
> + *  Use PAGE_SIZE as a minimum for smaller configurations while avoiding
> + *  unsigned comparison to -1.
>   */
> -#define CPUMAP_FILE_MAX_BYTES  ((((NR_CPUS * 9)/32 - 1) > PAGE_SIZE) \
> +#define CPUMAP_FILE_MAX_BYTES  (((NR_CPUS * 9)/32 > PAGE_SIZE) \
>  					? (NR_CPUS * 9)/32 - 1 : PAGE_SIZE)
>  #define CPULIST_FILE_MAX_BYTES  (((NR_CPUS * 7)/2 > PAGE_SIZE) ? (NR_CPUS * 7)/2 : PAGE_SIZE)
>  
> -- 
> 2.31.1
Re: [PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES
Posted by Phil Auld 3 years, 7 months ago
On Tue, Sep 06, 2022 at 01:59:53PM -0700 Yury Norov wrote:
> On Tue, Sep 06, 2022 at 04:35:42PM -0400, Phil Auld wrote:
> > As PAGE_SIZE is unsigned long, -1 > PAGE_SIZE when NR_CPUS <= 3.
> > This leads to very large file sizes:
> > 
> > topology$ ls -l
> > total 0
> > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 core_cpus
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_cpus_list
> > -r--r--r-- 1 root root                 4096 Sep  5 10:58 core_id
> > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 core_siblings
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_siblings_list
> > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 die_cpus
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_cpus_list
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_id
> > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 package_cpus
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 package_cpus_list
> > -r--r--r-- 1 root root                 4096 Sep  5 10:58 physical_package_id
> > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 thread_siblings
> > -r--r--r-- 1 root root                 4096 Sep  5 11:59 thread_siblings_list
> > 
> > Adjust the inequality to catch the case when NR_CPUS is configured
> > to a small value.
> > 
> > Fixes: 7ee951acd31a ("drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist")
> > Reported-by: feng xiangjun <fengxj325@gmail.com>
> > Signed-off-by: Phil Auld <pauld@redhat.com>
> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Cc: "Rafael J. Wysocki" <rafael@kernel.org>
> > Cc: Yury Norov <yury.norov@gmail.com>
> > Cc: stable@vger.kernel.org
> > Cc: feng xiangjun <fengxj325@gmail.com>
> 
> Applied on bitmap-for-next. Thanks!
>

Great, thanks!

> > ---
> > 
> > v2: Remove the +/-1 completely from the test since it will produce the
> > same results, and remove some extra parentheses.
> > 
> >  include/linux/cpumask.h | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
> > index bd047864c7ac..e8ad12b5b9d2 100644
> > --- a/include/linux/cpumask.h
> > +++ b/include/linux/cpumask.h
> > @@ -1127,9 +1127,10 @@ cpumap_print_list_to_buf(char *buf, const struct cpumask *mask,
> >   * cover a worst-case of every other cpu being on one of two nodes for a
> >   * very large NR_CPUS.
> >   *
> > - *  Use PAGE_SIZE as a minimum for smaller configurations.
> > + *  Use PAGE_SIZE as a minimum for smaller configurations while avoiding
> > + *  unsigned comparison to -1.
> >   */
> > -#define CPUMAP_FILE_MAX_BYTES  ((((NR_CPUS * 9)/32 - 1) > PAGE_SIZE) \
> > +#define CPUMAP_FILE_MAX_BYTES  (((NR_CPUS * 9)/32 > PAGE_SIZE) \
> >  					? (NR_CPUS * 9)/32 - 1 : PAGE_SIZE)
> >  #define CPULIST_FILE_MAX_BYTES  (((NR_CPUS * 7)/2 > PAGE_SIZE) ? (NR_CPUS * 7)/2 : PAGE_SIZE)
> >  
> > -- 
> > 2.31.1
> 

--
Re: [PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES
Posted by Greg Kroah-Hartman 3 years, 6 months ago
On Tue, Sep 06, 2022 at 06:19:23PM -0400, Phil Auld wrote:
> On Tue, Sep 06, 2022 at 01:59:53PM -0700 Yury Norov wrote:
> > On Tue, Sep 06, 2022 at 04:35:42PM -0400, Phil Auld wrote:
> > > As PAGE_SIZE is unsigned long, -1 > PAGE_SIZE when NR_CPUS <= 3.
> > > This leads to very large file sizes:
> > > 
> > > topology$ ls -l
> > > total 0
> > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 core_cpus
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_cpus_list
> > > -r--r--r-- 1 root root                 4096 Sep  5 10:58 core_id
> > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 core_siblings
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_siblings_list
> > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 die_cpus
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_cpus_list
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_id
> > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 package_cpus
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 package_cpus_list
> > > -r--r--r-- 1 root root                 4096 Sep  5 10:58 physical_package_id
> > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 thread_siblings
> > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 thread_siblings_list
> > > 
> > > Adjust the inequality to catch the case when NR_CPUS is configured
> > > to a small value.
> > > 
> > > Fixes: 7ee951acd31a ("drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist")
> > > Reported-by: feng xiangjun <fengxj325@gmail.com>
> > > Signed-off-by: Phil Auld <pauld@redhat.com>
> > > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > > Cc: "Rafael J. Wysocki" <rafael@kernel.org>
> > > Cc: Yury Norov <yury.norov@gmail.com>
> > > Cc: stable@vger.kernel.org
> > > Cc: feng xiangjun <fengxj325@gmail.com>
> > 
> > Applied on bitmap-for-next. Thanks!
> >
> 
> Great, thanks!

This is hitting people already and causing problems, so I'll go add it
to my tree as well to get it to Linus quicker.  Here's one report of the
problem:
	https://github.com/util-linux/util-linux/issues/1810

thanks,

greg k-h
Re: [PATCH v2] drivers/base: Fix unsigned comparison to -1 in CPUMAP_FILE_MAX_BYTES
Posted by Phil Auld 3 years, 6 months ago
On Thu, Sep 22, 2022 at 01:02:45PM +0200 Greg Kroah-Hartman wrote:
> On Tue, Sep 06, 2022 at 06:19:23PM -0400, Phil Auld wrote:
> > On Tue, Sep 06, 2022 at 01:59:53PM -0700 Yury Norov wrote:
> > > On Tue, Sep 06, 2022 at 04:35:42PM -0400, Phil Auld wrote:
> > > > As PAGE_SIZE is unsigned long, -1 > PAGE_SIZE when NR_CPUS <= 3.
> > > > This leads to very large file sizes:
> > > > 
> > > > topology$ ls -l
> > > > total 0
> > > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 core_cpus
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_cpus_list
> > > > -r--r--r-- 1 root root                 4096 Sep  5 10:58 core_id
> > > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 core_siblings
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 core_siblings_list
> > > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 die_cpus
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_cpus_list
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 die_id
> > > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 11:59 package_cpus
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 package_cpus_list
> > > > -r--r--r-- 1 root root                 4096 Sep  5 10:58 physical_package_id
> > > > -r--r--r-- 1 root root 18446744073709551615 Sep  5 10:10 thread_siblings
> > > > -r--r--r-- 1 root root                 4096 Sep  5 11:59 thread_siblings_list
> > > > 
> > > > Adjust the inequality to catch the case when NR_CPUS is configured
> > > > to a small value.
> > > > 
> > > > Fixes: 7ee951acd31a ("drivers/base: fix userspace break from using bin_attributes for cpumap and cpulist")
> > > > Reported-by: feng xiangjun <fengxj325@gmail.com>
> > > > Signed-off-by: Phil Auld <pauld@redhat.com>
> > > > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > > > Cc: "Rafael J. Wysocki" <rafael@kernel.org>
> > > > Cc: Yury Norov <yury.norov@gmail.com>
> > > > Cc: stable@vger.kernel.org
> > > > Cc: feng xiangjun <fengxj325@gmail.com>
> > > 
> > > Applied on bitmap-for-next. Thanks!
> > >
> > 
> > Great, thanks!
> 
> This is hitting people already and causing problems, so I'll go add it
> to my tree as well to get it to Linus quicker.  Here's one report of the
> problem:
> 	https://github.com/util-linux/util-linux/issues/1810
>

Arrgh! Thanks Greg. I stopped watching it when it got merged above but yeah,
this needs to get in soon and then get into any stable trees that got the first
one. Sorry about that!

Cheers,
Phil


> thanks,
> 
> greg k-h
> 

--