Messages in this thread | | | Date | Sat, 5 Jul 2008 11:44:54 +0400 | From | "Alexey Dobriyan" <> | Subject | Re: *sigh* /proc/*/pagemap |
| |
On 7/5/08, Andrew Morton <akpm@linux-foundation.org> wrote: > On Sat, 5 Jul 2008 05:07:02 +0400 "Alexey Dobriyan" <adobriyan@gmail.com> > wrote:
>> 3) unstatic struct pagemap_walk, so two threads won't fsckup each other >> (including those started by root, including flipping ->mm when you >> don't have permissions), > > Below
Below.
>> 4) remove second ptrace_may_attach(), and > > Can't find what you're referring to here.
pagemap_read() contains two calls to ptrace_may_attach(), second one looks unneeded.
>> 5) check with microscope allocation there -- page-aligned address and size >> == 0 >> should allocate 0 bytes, and > > Where?
kmalloc() in pagemap_read(). kmalloc(0) and integer wraparound look possible.
>> 6) actually check that it works. > > Will have a shot.
Ha-ha!
> - unstatic struct pagemap_walk, so two threads won't fsckup each other > (including those started by root, including flipping ->mm when you don't > have permissions)
> --- a/fs/proc/task_mmu.c~pagemap-fixes-to-pagemap_read > +++ a/fs/proc/task_mmu.c > @@ -641,6 +636,7 @@ static ssize_t pagemap_read(struct file > struct pagemapread pm; > int pagecount; > int ret = -ESRCH; > + static struct mm_walk pagemap_walk;
No, can't have static here, two threads doing pagemap_read() will overwrite each other's .mm and "out" at least. Like "pm" it shouldn't be global.
It doesn't oops here for unknown reasons, though.
> @@ -684,6 +681,11 @@ static ssize_t pagemap_read(struct file > pm.out = (u64 *)buf; > pm.end = (u64 *)(buf + count); > > + pagemap_walk.pmd_entry = pagemap_pte_range; > + pagemap_walk.pte_hole = pagemap_pte_hole; > + pagemap_walk.mm = mm; > + pagemap_walk.private = ±
| |