lkml.org 
[lkml]   [2009]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH]Fix: 32bit binary has 64bit address of stack vma
    From
    Thanks Andrew.

    On Mon, Jan 12, 2009 at 2:59 PM, Andrew Morton
    <akpm@linux-foundation.org> wrote:
    > On Mon, 5 Jan 2009 15:39:07 -0800
    > Ying Han <yinghan@google.com> wrote:
    >
    >> From: Ying Han <yinghan@google.com>
    >>
    >> Fix 32bit binary get 64bit stack vma offset.
    >>
    >> 32bit binary running on 64bit system, the /proc/pid/maps shows for the
    >> vma represents stack get a 64bit adress:
    >> ff96c000-ff981000 rwxp 7ffffffea000 00:00 0 [stack]
    >>
    >> Signed-off-by: Ying Han <yinghan@google.com>
    >>
    >> fs/exec.c | 5 +-
    >>
    >> diff --git a/fs/exec.c b/fs/exec.c
    >> index 4e834f1..8c3eff4 100644
    >> --- a/fs/exec.c
    >> +++ b/fs/exec.c
    >> @@ -517,6 +517,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, uns
    >> unsigned long length = old_end - old_start;
    >> unsigned long new_start = old_start - shift;
    >> unsigned long new_end = old_end - shift;
    >> + unsigned long new_pgoff = new_start >> PAGE_SHIFT;
    >> struct mmu_gather *tlb;
    >>
    >> BUG_ON(new_start > new_end);
    >> @@ -531,7 +532,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, uns
    >> /*
    >> * cover the whole range: [new_start, old_end)
    >> */
    >> - vma_adjust(vma, new_start, old_end, vma->vm_pgoff, NULL);
    >> + vma_adjust(vma, new_start, old_end, new_pgoff, NULL);
    >>
    >> /*
    >> * move the page tables downwards, on failure we rely on
    >> @@ -564,7 +565,7 @@ static int shift_arg_pages(struct vm_area_struct *vma, uns
    >> /*
    >> * shrink the vma to just the new range.
    >> */
    >> - vma_adjust(vma, new_start, new_end, vma->vm_pgoff, NULL);
    >> + vma_adjust(vma, new_start, new_end, new_pgoff, NULL);
    >>
    >> return 0;
    >
    > I rewrote the chagnelog as below. Please confirm that it makes sense?
    >
    >
    > Subject: fs/exec.c: fix value of vma->vm_pgoff for the stack VMA of 32-bit processes
    > From: Ying Han <yinghan@google.com>
    >
    > With a 32 bit binary running on a 64 bit system, the /proc/pid/maps for
    > the [stack] VMA displays a 64-bit address:
    >
    > ff96c000-ff981000 rwxp 7ffffffea000 00:00 0 [stack]
    looks good.
    >
    > This is because vma->vm_pgoff for that VMA is incorrectly being stored in
    > units of offset-in-bytes. It should be stored in units of offset-in-pages.
    that is not the problem. the real problem here is that the
    vma->vm_pgoff is initialized as 64bit address. When
    it is doing the shift_arg_pages, it supposed to be readjust to 32bit.
    It did for newstart and newend, but still
    used the old vma->start(64bit) for vma->pgoff. Here i make the change
    to get the newpgoff based on the newstart.
    > Signed-off-by: Ying Han <yinghan@google.com>
    > Cc: Mike Waychison <mikew@google.com>
    > Cc: Hugh Dickins <hugh@veritas.com>
    > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    > ---
    >
    > fs/exec.c | 5 +++--
    > 1 file changed, 3 insertions(+), 2 deletions(-)
    >
    > diff -puN fs/exec.c~fs-execc-fix-value-of-vma-vm_pgoff-for-the-stack-vma-of-32-bit-processes fs/exec.c
    > --- a/fs/exec.c~fs-execc-fix-value-of-vma-vm_pgoff-for-the-stack-vma-of-32-bit-processes
    > +++ a/fs/exec.c
    > @@ -509,6 +509,7 @@ static int shift_arg_pages(struct vm_are
    > unsigned long length = old_end - old_start;
    > unsigned long new_start = old_start - shift;
    > unsigned long new_end = old_end - shift;
    > + unsigned long new_pgoff = new_start >> PAGE_SHIFT;
    > struct mmu_gather *tlb;
    >
    > BUG_ON(new_start > new_end);
    > @@ -523,7 +524,7 @@ static int shift_arg_pages(struct vm_are
    > /*
    > * cover the whole range: [new_start, old_end)
    > */
    > - vma_adjust(vma, new_start, old_end, vma->vm_pgoff, NULL);
    > + vma_adjust(vma, new_start, old_end, new_pgoff, NULL);
    >
    > /*
    > * move the page tables downwards, on failure we rely on
    > @@ -556,7 +557,7 @@ static int shift_arg_pages(struct vm_are
    > /*
    > * shrink the vma to just the new range.
    > */
    > - vma_adjust(vma, new_start, new_end, vma->vm_pgoff, NULL);
    > + vma_adjust(vma, new_start, new_end, new_pgoff, NULL);
    >
    > return 0;
    > }
    > _
    >
    >


    \
     
     \ /
      Last update: 2009-01-13 00:25    [W:0.036 / U:30.664 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site