[PATCH v2 01/50] lib: Add memdup()
Pratyush Yadav
p.yadav at ti.com
Thu May 6 19:07:41 CEST 2021
On 06/05/21 08:23AM, Simon Glass wrote:
> Add a function to duplicate a memory region, a little like strdup().
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2:
> - Add a patch to introduce a memdup() function
>
> include/linux/string.h | 13 +++++++++++++
> lib/string.c | 13 +++++++++++++
> test/lib/string.c | 32 ++++++++++++++++++++++++++++++++
> 3 files changed, 58 insertions(+)
>
> diff --git a/include/linux/string.h b/include/linux/string.h
> index dd255f21633..3169c93796e 100644
> --- a/include/linux/string.h
> +++ b/include/linux/string.h
> @@ -129,6 +129,19 @@ extern void * memchr(const void *,int,__kernel_size_t);
> void *memchr_inv(const void *, int, size_t);
> #endif
>
> +/**
> + * memdup() - allocate a buffer and copy in the contents
> + *
> + * Note that this returns a valid pointer even if @len is 0
I'm uneducated about U-Boot's memory allocator. But I wonder how it
returns a valid pointer even on 0 length allocations. What location does
it point to? What are users expected to do with that pointer? They
obviously can't read/write to it since it is supposed to be a 0 byte
long allocation. If another positive length allocation happens before
the said pointer is freed, will it point to the same memory location? If
not, isn't the 0-length pointer actually at least a 1-length pointer?
> + *
> + * @src: data to copy in
> + * @len: number of bytes to copy
> + * @return allocated buffer with the copied contents, or NULL if not enough
> + * memory is available
> + *
> + */
> +char *memdup(const void *src, size_t len);
> +
> unsigned long ustrtoul(const char *cp, char **endp, unsigned int base);
> unsigned long long ustrtoull(const char *cp, char **endp, unsigned int base);
>
> diff --git a/lib/string.c b/lib/string.c
> index a0cff8fe88e..1be61ee0499 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -658,6 +658,19 @@ void * memscan(void * addr, int c, size_t size)
> }
> #endif
>
> +char *memdup(const void *src, size_t len)
> +{
> + char *p;
> +
> + p = malloc(len);
> + if (!p)
> + return NULL;
> +
> + memcpy(p, src, len);
> +
> + return p;
> +}
> +
> #ifndef __HAVE_ARCH_STRSTR
> /**
> * strstr - Find the first substring in a %NUL terminated string
[...]
--
Regards,
Pratyush Yadav
Texas Instruments Inc.
More information about the U-Boot
mailing list