From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C474BC4338F for ; Sun, 1 Aug 2021 21:25:26 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 15C6060295 for ; Sun, 1 Aug 2021 21:25:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 15C6060295 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 39417832CC; Sun, 1 Aug 2021 23:25:24 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="BfrXQJda"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id EC32F832D0; Sun, 1 Aug 2021 23:25:22 +0200 (CEST) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 31412829FC for ; Sun, 1 Aug 2021 23:25:20 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1627853118; bh=NNcdzU1SlLSj2djMo/0irgx3L7CtEJkCmeGh0Aitmgs=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=BfrXQJdaB444bj/t4iAbrzZ/SnWMcZLjA/hVbaaDeBFd1e/BNXqPVSakEgOScGghs uL2h0Km40TW+kCaeD2lmk8PaCpu837RqWgXdFQt2tvnWJPFRpVgTLPiKOdWOzrdg0u wI5+2XRgut3eZukdypBZ71oKGQoXtG/VVrwQQvRI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.123.35] ([88.152.144.157]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MWAOW-1mgqiy1haU-00Xd2A; Sun, 01 Aug 2021 23:25:18 +0200 Subject: Re: [PATCH v3 01/15] lib: Add memdup() To: Simon Glass , U-Boot Mailing List Cc: Bin Meng , Tom Rini , Alexandru Gagniuc References: <20210801210032.2203104-1-sjg@chromium.org> <20210801150024.v3.1.I1d417387eb1e7273b536017f4a8920fc4e2369a9@changeid> From: Heinrich Schuchardt Message-ID: Date: Sun, 1 Aug 2021 23:25:17 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: <20210801150024.v3.1.I1d417387eb1e7273b536017f4a8920fc4e2369a9@changeid> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:UiFdLIbBiQEADvrSqlmOLNI0MH9f9T9i/IrTUdLH7Q14wBuSk20 AXdDlXksLx6GNpuAlbbUj3GlqXBbrI/dv7qoa/djwkRTJllSE5gGUPzuBCnIKNKCfpzT7VE Pum/j6jxohSw3sGJpCzD3i47oxGDunWtrb2LBX5IvbQCfk5N4j/AP+7tbgreMeKmKnEb8/7 RDqSt1Ic8PB+4Zddu83Ew== X-UI-Out-Filterresults: notjunk:1;V03:K0:u689TWDX0So=:bSAanDYj1oV8z07ZwWbE90 3KzmP6d0dcSS3IhX9mqYKD+0DVWGXUcJztSXArU7euhW2naUwiAcT9Rr23c7p3e28avqHa/PH nPCj1sVoAlYERdf71QJVE87JTlnjyT1yg3/xhubxFBCFz+5PtZN+0xyYYxMGMPQ9Xe13IUJ6q L75aVxqzUcMOplcpsTP94AXtTrlv2mVAxl4s/hf/gi7eGfPYAgkTmUi3BZ+wggyYmTqVSrdps ddHDNQeGRfiEYxg0REVaZNdZ2gXZZj0UONVNqsrkSWCed6uFvVQvIKCOOsIkNLY/XF4Gadat2 vKf2oVp0/33JWXNjryCPqBRR07+EYxrjD54r34b/6hXJWYgQWbs7Tc5utS5EzETnJzbtGwK6H OS7lv3MoF5+Zmnyw4j/uoA19WMUgpwuIRlBtw9Aa4pKEr+qCRDXAMQDoTOQuBzVvWCQm3DuBk DINA8Ui8UpZmzr8a5gmeH0PFxfQZVfwp6Q0+ruYJd15VBf2/mUnsx7h7C4qLYrFUsWvgNcbmN VXME7qq8uPdf74VuPB+aiVyCjnWY+Xd78RBc1/Z4BfT95MRs5Hy3kByiBhqXw+mAjD54pzWTG ZNCoRClbG/6o8gGV8XNmrVKQfq666fxKufaydAM67gjC23/wiHo4SqwFLNL3bnGVGwWINMFt/ fwZ4EMmTkiMoIJYMx4RFYGjbBvtd/jkRqQy+5zb2F+G0eUGTwQuPRYbUOk7ufdEaN3Hm3AScg GCdhWDiawk4X8ZdWlNpZYKJZVGlzJZDX4bPR+p6N6k9gCW4zbkBjV63lsRurc5mO3oDDdCAJg phVu3fxQGa8rnzRHVqyUShsF2WURWRQ5jXK5BxWGQOQYa42OzoDOPZuVx1VYPyIxtwvOT2YqV 4bpOIjCiA5vVerFhTpEPNGvxfnIfy2ubVftFrUBiKEchE7UaD0jKChD5TNc1ueGc6mEHAVyBJ s2RJoD7rbSdqBRtIiy1PItQos4DObpu7MGwkAxT50hsgUn4zwYoxZ5r++7ncHroXBEBmxIwnH dAXijnxayivF9J72mupomcPi61j8V5HEhz/JwTVNA3eiSuIYkIJiBwoMVaT/kYOuxSqLNZ/DX A1FsnT0ZweXXrEsTTe1EI+cvFfUeaarffCM X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean On 8/1/21 11:00 PM, Simon Glass wrote: > Add a function to duplicate a memory region, a little like strdup(). > > Signed-off-by: Simon Glass > --- > > (no changes since v2) > > 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 This partially duplicates realloc(). The only difference is that realloc() frees the old buffer. But it seems rEALLOc() has too much logic to easily join the two functions. Reviewed-by: Heinrich Schuchardt > + * > + * Note that this returns a valid pointer even if @len is 0 > + * > + * @src: data to copy in > + * @len: number of bytes to copy > + * @return allocated buffer with the copied contents, or NULL if not en= ough > + * 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 ba176fb08f7..78bd65c4136 100644 > --- a/lib/string.c > +++ b/lib/string.c > @@ -659,6 +659,19 @@ void * memscan(void * addr, int c, size_t size) > } > #endif > > +char *memdup(const void *src, size_t len) > +{ > + char *p; > + > + p =3D 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 > diff --git a/test/lib/string.c b/test/lib/string.c > index 64234bef36c..5dcf4d6db00 100644 > --- a/test/lib/string.c > +++ b/test/lib/string.c > @@ -23,6 +23,8 @@ > /* Allow for copying up to 32 bytes */ > #define BUFLEN (SWEEP + 33) > > +#define TEST_STR "hello" > + > /** > * init_buffer() - initialize buffer > * > @@ -193,3 +195,33 @@ static int lib_memmove(struct unit_test_state *uts) > } > > LIB_TEST(lib_memmove, 0); > + > +/** lib_memdup() - unit test for memdup() */ > +static int lib_memdup(struct unit_test_state *uts) > +{ > + char buf[BUFLEN]; > + size_t len; > + char *p, *q; > + > + /* Zero size should do nothing */ > + p =3D memdup(NULL, 0); > + ut_assertnonnull(p); > + free(p); > + > + p =3D memdup(buf, 0); > + ut_assertnonnull(p); > + free(p); > + > + strcpy(buf, TEST_STR); > + len =3D sizeof(TEST_STR); > + p =3D memdup(buf, len); > + ut_asserteq_mem(p, buf, len); > + > + q =3D memdup(p, len); > + ut_asserteq_mem(q, buf, len); > + free(q); > + free(p); > + > + return 0; > +} > +LIB_TEST(lib_memdup, 0); >