[CRIU] [PATCH] zdtm: cmdlinenv00 -- fix false positive fail on 'auxv' corruption after 32-bit -> 64-bit migration

Andrew Vagin avagin at parallels.com
Mon Dec 3 07:46:37 EST 2012


Cyrill, pls review this patch. I think you know more about auxv;)

On Fri, Nov 30, 2012 at 06:07:41PM +0400, Konstantin Khlebnikov wrote:
> Content of /proc/$pid/auxv declared as array of long and this file hasn't compat layer.
> 
> https://jira.sw.ru/browse/PSBM-16280
> 
> Signed-off-by: Konstantin Khlebnikov <khlebnikov at openvz.org>
> ---
>  test/zdtm/live/static/cmdlinenv00.c |   25 ++++++++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/test/zdtm/live/static/cmdlinenv00.c b/test/zdtm/live/static/cmdlinenv00.c
> index 68787f0..dae1d97 100644
> --- a/test/zdtm/live/static/cmdlinenv00.c
> +++ b/test/zdtm/live/static/cmdlinenv00.c
> @@ -44,6 +44,29 @@ static void read_from_proc(const char *path, char *buf, size_t size)
>  	close(fd);
>  }
>  
> +static int cmp_auxv(const void *auxv_orig, const void *auxv, size_t size)
> +{
> +	const unsigned long long *new = auxv;
> +	const unsigned int *old = auxv_orig;
> +
> +	if (!memcmp(auxv_orig, auxv, size))
> +		return 0;
> +
> +	/*
> +	 * File /proc/$pid/auxv does not has compat layer, this "array of long"
> +	 * has different byte-representation between 32-bit and 64-bit host.
> +	 * We can migrate tasks only in one direction, thus check is simple.
> +	 */
> +	while (size > 0) {
> +		if (*new != *old)
> +			return -1;
> +		new++;
> +		old++;
> +		size -= sizeof(*new);
> +	}
> +	return 0;
> +}
> +
>  int main(int argc, char *argv[])
>  {
>  	char cmdline_orig[4096];
> @@ -89,7 +112,7 @@ int main(int argc, char *argv[])
>  		exit(1);
>  	}
>  
> -	if (memcmp(auxv_orig, auxv, sizeof(auxv_orig))) {
> +	if (cmp_auxv(auxv_orig, auxv, sizeof(auxv_orig))) {
>  		fail("auxv corrupted on restore");
>  		exit(1);
>  	}
> 


More information about the CRIU mailing list