[CRIU] [PATCH 3/6] compel: Add arguments packing helper

Pavel Emelyanov xemul at virtuozzo.com
Wed Oct 12 00:56:56 PDT 2016


Patch comment, please.

On 09/29/2016 12:34 AM, Cyrill Gorcunov wrote:
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  compel/Makefile              |  2 ++
>  compel/include/uapi/compel.h |  4 ++++
>  compel/src/lib/argv.c        | 39 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 45 insertions(+)
>  create mode 100644 compel/src/lib/argv.c
> 
> diff --git a/compel/Makefile b/compel/Makefile
> index bfb79237dbb2..eb46393f3355 100644
> --- a/compel/Makefile
> +++ b/compel/Makefile
> @@ -15,6 +15,8 @@ host-lib-y		+= arch/$(ARCH)/src/lib/handle-elf.o
>  lib-y			+= src/lib/handle-elf.o
>  host-lib-y		+= src/lib/handle-elf.o
>  
> +lib-y			+= src/lib/argv.o
> +
>  ifeq ($(ARCH),x86)
>  lib-y			+= src/lib/handle-elf-32.o
>  host-lib-y		+= src/lib/handle-elf-32.o
> diff --git a/compel/include/uapi/compel.h b/compel/include/uapi/compel.h
> index 10507ce3fb22..9148f94bda45 100644
> --- a/compel/include/uapi/compel.h
> +++ b/compel/include/uapi/compel.h
> @@ -14,4 +14,8 @@ typedef struct {
>  	long		value;
>  } compel_reloc_t;
>  
> +extern int libcompel_pack_argv(void *blob, size_t blob_size,
> +			       int argc, char **argv,
> +			       void **arg_p, size_t *arg_size);
> +
>  #endif /* UAPI_COMPEL_H__ */
> diff --git a/compel/src/lib/argv.c b/compel/src/lib/argv.c
> new file mode 100644
> index 000000000000..86f354e83679
> --- /dev/null
> +++ b/compel/src/lib/argv.c
> @@ -0,0 +1,39 @@
> +#include <stdlib.h>
> +#include <string.h>
> +
> +#include "uapi/compel.h"
> +
> +int libcompel_pack_argv(void *blob, size_t blob_size,
> +			int argc, char **argv,
> +			void **arg_p, size_t *arg_size)
> +{
> +	unsigned long *argv_packed;
> +	size_t total_len;
> +	int i, *argc_packed;
> +	char *args_mem;
> +
> +	total_len = sizeof(int);
> +	total_len += sizeof(unsigned long) + blob_size + 1;
> +	for (i = 0; i < argc; i++)
> +		total_len += sizeof(unsigned long) + strlen(argv[i]) + 1;
> +
> +	argc_packed = malloc(total_len);
> +	if (!argc_packed)
> +		return -ENOMEM;
> +
> +	*argc_packed = argc + 1;
> +	argv_packed = (unsigned long *)(argc_packed + 1);
> +	args_mem = (char *)(argv_packed + argc + 1);
> +	argv_packed[0] = (void *)args_mem - (void *)argc_packed;
> +	memcpy(args_mem, blob, blob_size);
> +	args_mem += blob_size + 1;
> +	for (i = 0; i < argc; i++) {
> +		argv_packed[i + 1] = (void *)args_mem - (void *)argc_packed;
> +		args_mem = stpcpy(args_mem, argv[i]) + 1;
> +	}
> +
> +	*arg_p = argc_packed;
> +	*arg_size = total_len;
> +
> +	return 0;
> +}
> 



More information about the CRIU mailing list