[CRIU] [PATCH] vdso: Correctly track vdso position without vvar

Andrei Vagin avagin at gmail.com
Tue Aug 13 17:45:47 MSK 2019


Applied, thanks!

On Sat, Aug 10, 2019 at 02:33:29AM +0100, Dmitry Safonov wrote:
> If vvar is absent vdso_before_vvar is initialized by "false".
> Which means that the check that supposed to track vdso/vvar pair went
> into wrong brackets. In result it broke CRIU on kernels that don't have
> vvar mapping.
> 
> Simpilfy the code by moving the check for VVAR_BAD_SIZE outside of
> conditional for vdso_before_vvar.
> 
> Reported-by: Cyrill Gorcunov <gorcunov at gmail.com>
> Fixes: 0918c7667647 ("vdso/restorer: Always track vdso/vvar positions in
> vdso_maps_rt")
> Signed-off-by: Dmitry Safonov <dima at arista.com>
> ---
>  criu/pie/restorer.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
> index 6f8f1ae543ae..390c0e1a9a03 100644
> --- a/criu/pie/restorer.c
> +++ b/criu/pie/restorer.c
> @@ -1293,13 +1293,16 @@ static int map_vdso(struct task_restore_args *args, bool compatible)
>  		return err;
>  	}
>  
> +	/* kernel may provide only vdso */
> +	if (rt->sym.vvar_size == VVAR_BAD_SIZE) {
> +		rt->vdso_start = args->vdso_rt_parked_at;
> +		rt->vvar_start = VVAR_BAD_ADDR;
> +		return 0;
> +	}
> +
>  	if (rt->sym.vdso_before_vvar) {
>  		rt->vdso_start = args->vdso_rt_parked_at;
> -		/* kernel may provide only vdso */
> -		if (rt->sym.vvar_size != VVAR_BAD_SIZE)
> -			rt->vvar_start = rt->vdso_start + rt->sym.vdso_size;
> -		else
> -			rt->vvar_start = VVAR_BAD_ADDR;
> +		rt->vvar_start = rt->vdso_start + rt->sym.vdso_size;
>  	} else {
>  		rt->vvar_start = args->vdso_rt_parked_at;
>  		rt->vdso_start = rt->vvar_start + rt->sym.vvar_size;
> -- 
> 2.22.0
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list