Skip to contentSkip to conversation

sh: Support for multiple nodes.

PATCH In review Dan Carpenter 2 participants 4 messages Dec 3, 2014 – Dec 4, 2014

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hello Paul Mundt,

The patch b241cb0c885e: "sh: Support for multiple nodes." from Jun 6, 2007, leads to the following static checker warning:

	arch/sh/mm/numa.c:47 setup_bootmem_node()
	error: buffer overflow 'node_data' 1024 <= 1024

arch/sh/mm/numa.c

    27  void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
    28  {
    29          unsigned long bootmap_pages;
    30          unsigned long start_pfn, end_pfn;
    31          unsigned long bootmem_paddr;
    32  
    33          /* Don't allow bogus node assignment */
    34          BUG_ON(nid > MAX_NUMNODES || nid <= 0);
                       ^^^^^^^^^^^^^^^^^^

It's not very important but this check is off by one so static checkers complain.

    35  
    36          start_pfn = start >> PAGE_SHIFT;
    37          end_pfn = end >> PAGE_SHIFT;
    38  
    39          pmb_bolt_mapping((unsigned long)__va(start), start, end - start,
    40                           PAGE_KERNEL);
    41  
    42          memblock_add(start, end - start);
    43  
    44          __add_active_range(nid, start_pfn, end_pfn);
    45  
    46          /* Node-local pgdat */
    47          NODE_DATA(nid) = __va(memblock_alloc_base(sizeof(struct pglist_data),
    48                                               SMP_CACHE_BYTES, end));
    49          memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
    50  

regards,
dan carpenter

#1 lore raw

Hi Dan,

Quoted 17 lines · Dan Carpenter

The patch b241cb0c885e: "sh: Support for multiple nodes." from Jun 6, 2007, leads to the following static checker warning:

        arch/sh/mm/numa.c:47 setup_bootmem_node()
        error: buffer overflow 'node_data' 1024 <= 1024

arch/sh/mm/numa.c

    27  void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
    28  {
    29          unsigned long bootmap_pages;
    30          unsigned long start_pfn, end_pfn;
    31          unsigned long bootmem_paddr;
    32
    33          /* Don't allow bogus node assignment */
    34          BUG_ON(nid > MAX_NUMNODES || nid <= 0);
                       ^^^^^^^^^^^^^^^^^^
Quoted 2 lines

It's not very important but this check is off by one so static checkers complain.

Thanks for your analysis!

Please note that sh is orphaned. Andrew Morton does accept patches.

Quoted 8 lines
    35
    36          start_pfn = start >> PAGE_SHIFT;
    37          end_pfn = end >> PAGE_SHIFT;
    38
    39          pmb_bolt_mapping((unsigned long)__va(start), start, end - start,
    40                           PAGE_KERNEL);
    41
    42          memblock_add(start, end - start);
Quoted 8 lines
    43
    44          __add_active_range(nid, start_pfn, end_pfn);
    45
    46          /* Node-local pgdat */
    47          NODE_DATA(nid) = __va(memblock_alloc_base(sizeof(struct pglist_data),
    48                                               SMP_CACHE_BYTES, end));
    49          memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
    50

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

#2 lore raw

PATCH 1/1 sh: off by one BUG_ON() in setup_bootmem_node()

This off by one bug is harmless but it upsets the static checkers and the code is obvious so it doesn't hurt to fix it. The Smatch warning is:

	arch/sh/mm/numa.c:47 setup_bootmem_node()
	error: buffer overflow 'node_data' 1024 <= 1024
arch/sh/mm/numa.c +1 -1
index 3d85225..bce52ba 100644
@@ -31,7 +31,7 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
 	unsigned long bootmem_paddr;
 
 	/* Don't allow bogus node assignment */
-	BUG_ON(nid > MAX_NUMNODES || nid <= 0);
+	BUG_ON(nid >= MAX_NUMNODES || nid <= 0);
 
 	start_pfn = start >> PAGE_SHIFT;
 	end_pfn = end >> PAGE_SHIFT;
Acked-by on v1 1/1
#3 lore raw

Re: [patch] sh: off by one BUG_ON() in setup_bootmem_node()

Quoted 8 lines · Dan Carpenter

This off by one bug is harmless but it upsets the static checkers and the code is obvious so it doesn't hurt to fix it. The Smatch warning is:

        arch/sh/mm/numa.c:47 setup_bootmem_node()
        error: buffer overflow 'node_data' 1024 <= 1024

arch/sh/mm/numa.c void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end) · line 37

Quoted 13 lines
arch/sh/mm/numa.c +1 -1
index 3d85225..bce52ba 100644
@@ -31,7 +31,7 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
        unsigned long bootmem_paddr;
 
        /* Don't allow bogus node assignment */
-       BUG_ON(nid > MAX_NUMNODES || nid <= 0);
+       BUG_ON(nid >= MAX_NUMNODES || nid <= 0);
 
        start_pfn = start >> PAGE_SHIFT;
        end_pfn = end >> PAGE_SHIFT;

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds