: [CRIU] [PATCH] restorer: Make sure the protection on code/data mm areas do fit the kernel requirements

Cyrill Gorcunov gorcunov at openvz.org
Fri Apr 13 11:04:39 EDT 2012


On Fri, Apr 13, 2012 at 07:02:30PM +0400, Cyrill Gorcunov wrote:
> On Fri, Apr 13, 2012 at 06:59:25PM +0400, Pavel Emelyanov wrote:
> > > +	sys_mmap((void *)args->mm.mm_start_code, PAGE_SIZE, prot, flags, -1, 0);
> > > +	ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_START_CODE, (long)args->mm.mm_start_code, 0);
> > > +	sys_munmap((void *)args->mm.mm_start_code, PAGE_SIZE);
> > > +
> > > +	sys_mmap((void *)args->mm.mm_end_code, PAGE_SIZE, PROT_EXEC | PROT_READ, flags, -1, 0);
> > > +	ret |= sys_prctl_safe(PR_SET_MM, PR_SET_MM_END_CODE, (long)args->mm.mm_end_code, 0);
> > > +	sys_munmap((void *)args->mm.mm_end_code, PAGE_SIZE);
> > 
> > 
> > This is much nicer. Can we tune this a little bit more, i.e. like this
> > 
> > sys_mmap(code_start, code_end - code_start, ...)
> > sys_prctl(PR_SET_MM_START_CODE)
> > sys_prctl(PR_SET_MM_END_CODE)
> > sys_munmap()
> > 
> > i.e. mmap only one mapping per PR_SET_MM, not two?
> 
> I tried this, but it not always work, because .text and
> .data VMAs can cover really big space and we fail. Ie
> it will work sometimes, sometimes it'll fail. Better to
> stick with one which work always ;)

More precisely, imagin the data_start and data_end will look like
covering a number of VMAs including one we use for shared data
for restorer itself, thus such mmap() attempt will fail.

	Cyrill


More information about the CRIU mailing list