diff mbox

kernel BUG at mm/gup.c:LINE!

Message ID 20180705114043.GC30187@techadventures.net (mailing list archive)
State New, archived
Headers show

Commit Message

Oscar Salvador July 5, 2018, 11:40 a.m. UTC
On Thu, Jul 05, 2018 at 09:18:08AM +0200, Oscar Salvador wrote:
> > So, indeed "bss" needs to be aligned.
> > But ELF_PAGESTART() or ELF_PAGEALIGN(), which one to use?
> > 
> > #define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
> > #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
> > 
> > Is
> > 
> > -	len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
> > -			    ELF_MIN_ALIGN - 1);
> > +	len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
> > 
> > suggesting that
> > 
> > -	bss = eppnt->p_memsz + eppnt->p_vaddr;
> > +	bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
> > 
> > is the right choice? I don't know...
> 
> Yes, I think that ELF_PAGEALIGN is the right choice here.
> Given that bss is 0x7bf88676, using ELF_PAGESTART aligns it but backwards, while ELF_PAGEALIGN does
> the right thing:
> 
> bss = 0x7bf88676
> ELF_PAGESTART (bss) = 0x7bf88000
> ELF_PAGEALIGN (bss) = 0x7bf89000

I think this should do the trick:


I could only test it in x86_64 (with -m32).
Could you test it on x86_32?
diff mbox

Patch

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 0ac456b52bdd..6c7e005ae12d 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1259,9 +1259,9 @@  static int load_elf_library(struct file *file)
                goto out_free_ph;
        }
 
-       len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
-                           ELF_MIN_ALIGN - 1);
-       bss = eppnt->p_memsz + eppnt->p_vaddr;
+
+       len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
+       bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
        if (bss > len) {
                error = vm_brk(len, bss - len);
                if (error)