[PATCH next] x86/mm: Fix uninitialized variable in register_page_bootmem_memmap()

Dan Carpenter posted 1 patch 12 months ago
arch/x86/mm/init_64.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
[PATCH next] x86/mm: Fix uninitialized variable in register_page_bootmem_memmap()
Posted by Dan Carpenter 12 months ago
Smatch complains that "next" could be uninitialized.  The "next"
assignment was accidentally left out when we moved these lines to earlier
in the function.

Fixes: bdadaec1526d ("x86/mm: make register_page_bootmem_memmap handle PTE mappings")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
---
This goes through the -mm tree.

 arch/x86/mm/init_64.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index e7572af639a4..6e8e4ef5312a 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -1600,8 +1600,10 @@ void register_page_bootmem_memmap(unsigned long section_nr,
 		get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
 
 		pmd = pmd_offset(pud, addr);
-		if (pmd_none(*pmd))
+		if (pmd_none(*pmd)) {
+			next = (addr + PAGE_SIZE) & PAGE_MASK;
 			continue;
+		}
 
 		if (!boot_cpu_has(X86_FEATURE_PSE) || !pmd_leaf(*pmd)) {
 			next = (addr + PAGE_SIZE) & PAGE_MASK;
-- 
2.47.2
Re: [PATCH next] x86/mm: Fix uninitialized variable in register_page_bootmem_memmap()
Posted by Frank van der Linden 12 months ago
On Wed, Feb 12, 2025 at 7:21 AM Dan Carpenter <dan.carpenter@linaro.org> wrote:
>
> Smatch complains that "next" could be uninitialized.  The "next"
> assignment was accidentally left out when we moved these lines to earlier
> in the function.
>
> Fixes: bdadaec1526d ("x86/mm: make register_page_bootmem_memmap handle PTE mappings")
> Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
> ---
> This goes through the -mm tree.
>
>  arch/x86/mm/init_64.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
> index e7572af639a4..6e8e4ef5312a 100644
> --- a/arch/x86/mm/init_64.c
> +++ b/arch/x86/mm/init_64.c
> @@ -1600,8 +1600,10 @@ void register_page_bootmem_memmap(unsigned long section_nr,
>                 get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
>
>                 pmd = pmd_offset(pud, addr);
> -               if (pmd_none(*pmd))
> +               if (pmd_none(*pmd)) {
> +                       next = (addr + PAGE_SIZE) & PAGE_MASK;
>                         continue;
> +               }
>
>                 if (!boot_cpu_has(X86_FEATURE_PSE) || !pmd_leaf(*pmd)) {
>                         next = (addr + PAGE_SIZE) & PAGE_MASK;
> --
> 2.47.2
>

Thanks for catching that Dan. I believe Andrew took the series out of
mm-unstable because of some conflicts, and asked me to do a v4 for
mm-unstable. Would you mind if I just folded your change in to the v4
series?

As an aside, it seems that this function could use some cleanup. It
seems wrong to only advance by PAGE_SIZE when you encounter an
unpopulated p4d/pgd/pud/pmd. It should advance to the end of that
p4d/pgd/pud/pmd. I suppose that case won't happen in practice, though,
which is also why this hasn't caused me any issues.

- Frank
Re: [PATCH next] x86/mm: Fix uninitialized variable in register_page_bootmem_memmap()
Posted by Dan Carpenter 12 months ago
On Wed, Feb 12, 2025 at 09:59:54AM -0800, Frank van der Linden wrote:
> On Wed, Feb 12, 2025 at 7:21 AM Dan Carpenter <dan.carpenter@linaro.org> wrote:
> >
> > Smatch complains that "next" could be uninitialized.  The "next"
> > assignment was accidentally left out when we moved these lines to earlier
> > in the function.
> >
> > Fixes: bdadaec1526d ("x86/mm: make register_page_bootmem_memmap handle PTE mappings")
> > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
> > ---
> > This goes through the -mm tree.
> >
> >  arch/x86/mm/init_64.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
> > index e7572af639a4..6e8e4ef5312a 100644
> > --- a/arch/x86/mm/init_64.c
> > +++ b/arch/x86/mm/init_64.c
> > @@ -1600,8 +1600,10 @@ void register_page_bootmem_memmap(unsigned long section_nr,
> >                 get_page_bootmem(section_nr, pud_page(*pud), MIX_SECTION_INFO);
> >
> >                 pmd = pmd_offset(pud, addr);
> > -               if (pmd_none(*pmd))
> > +               if (pmd_none(*pmd)) {
> > +                       next = (addr + PAGE_SIZE) & PAGE_MASK;
> >                         continue;
> > +               }
> >
> >                 if (!boot_cpu_has(X86_FEATURE_PSE) || !pmd_leaf(*pmd)) {
> >                         next = (addr + PAGE_SIZE) & PAGE_MASK;
> > --
> > 2.47.2
> >
> 
> Thanks for catching that Dan. I believe Andrew took the series out of
> mm-unstable because of some conflicts, and asked me to do a v4 for
> mm-unstable. Would you mind if I just folded your change in to the v4
> series?

Yeah, no problem.  -mm patches are always folded.

regards,
dan carpenter