[PATCH 7/9] cr: checkpoint saved_auxv as u64s

Oren Laadan orenl at cs.columbia.edu
Tue Feb 9 09:20:14 PST 2010



serue at us.ibm.com wrote:
> From: Serge E. Hallyn <serue at us.ibm.com>
> 
> unsigned longs are not a good value to checkpoint between
> x86-32 and x86-64 32-bit tasks :)
> 
> Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
> ---
>  checkpoint/checkpoint.c        |    5 +--
>  checkpoint/memory.c            |   53 +++++++++++++++++++++++++++++++++++++--
>  checkpoint/restart.c           |    6 ++--
>  include/linux/checkpoint_hdr.h |    2 +-
>  4 files changed, 56 insertions(+), 10 deletions(-)

[...]

Sketch for a sanity check:

> +static int ckpt_read_auxv(struct ckpt_ctx *ctx, struct mm_struct *mm)
> +{
> +	int i, ret;
> +	u64 *buf = kmalloc(CKPT_AT_SZ, GFP_KERNEL);
> +
> +	if (!buf)
> +		return -ENOMEM;
> +	ret = _ckpt_read_buffer(ctx, buf, CKPT_AT_SZ);
> +	if (ret < 0) {
> +		kfree(buf);
> +		return ret;
> +	}
> +

	ret = -E2BIG;
> +	for (i=0; i<AT_VECTOR_SIZE; i++)
> +		if (buf[i] > (u64) ULONG_MAX)
			goto out;

	ret = -EINVAL;
	for (i=0; i<AT_VECTOR_SIZE; i++)
		if (mm->saved_auxv[i] == AT_NULL)
			ret = 0;
	if (ret < 0)
		goto out;

> +
> +	for (i=0; i<AT_VECTOR_SIZE; i++)
> +		mm->saved_auxv[i] = buf[i];
> +
 out:
> +	kfree(buf);
> +	return 0;
	       ret;

[...]

Oren.



More information about the Containers mailing list