From: Willy Tarreau <w@1wt.eu>
To: Rodrigo Campos <rodrigo@sdfg.com.ar>
Cc: "Thomas Weißschuh" <linux@weissschuh.net>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/4] tools/nolibc: Fix strlcpy() return code and size usage
Date: Sun, 11 Feb 2024 12:08:14 +0100 [thread overview]
Message-ID: <20240211110814.GB19364@1wt.eu> (raw)
In-Reply-To: <20240129141516.198636-4-rodrigo@sdfg.com.ar>
Hi Rodrigo,
On Mon, Jan 29, 2024 at 03:15:15PM +0100, Rodrigo Campos wrote:
> The return code should always be strlen(src), and we should copy at most
> size-1 bytes.
>
> While we are there, make sure to null-terminate the dst buffer.
>
> Signed-off-by: Rodrigo Campos <rodrigo@sdfg.com.ar>
> ---
> tools/include/nolibc/string.h | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h
> index b2149e1342a8..e4bc0302967d 100644
> --- a/tools/include/nolibc/string.h
> +++ b/tools/include/nolibc/string.h
> @@ -212,15 +212,16 @@ size_t strlcpy(char *dst, const char *src, size_t size)
> size_t len;
> char c;
>
> - for (len = 0;;) {
> + for (len = 0; len < size; len++) {
> c = src[len];
> - if (len < size)
> + if (len < size - 1)
> dst[len] = c;
> + if (len == size - 1)
> + dst[len] = '\0';
> if (!c)
> break;
> - len++;
> }
> - return len;
> + return strlen(src);
> }
It's good, but for the same reason as the previous one, I'm getting
smaller code by doing less in the loop. Also calling strlen() here
looks expensive, I'm seeing that the compiler inlined it nevertheless
and did it in a dep-optimized way due to the asm statement. That
results in 67 bytes total while a simpler version gives 47.
If I explicitly mark strlen() __attribute__((noinline)) that prevents
it from doing so starting with gcc-10, where it correctly places a jump
from strlcpy() to strlen() and ends up with 50 bytes (vs 44 for the alt
one). The other one I can propose is directly derived from the other
strlcat() variant, which first performs the copy and starts to count:
size_t strlcpy(char *dst, const char *src, size_t size)
{
size_t len;
for (len = 0; len < size; len++) {
if (!(dst[len] = src[len]))
return len;
}
/* end of src not found before size */
if (size)
dst[size - 1] = '\0';
while (src[len])
len++;
return len;
}
Just let me know what you think. And I think we should explicitly mark
strlen() and the few other ones we're marking weak as noinline so that
the compiler perfers a call there to inlining. Well, registers clobbering
might not always be worth, but given that strlen() alone provides some
savings I think it's still interesting.
Thanks,
Willy
next prev parent reply other threads:[~2024-02-11 11:08 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 14:15 [PATCH 0/4] tools/nolibc: Misc fixes for strlcpy() and strlcat() Rodrigo Campos
2024-01-29 14:15 ` [PATCH 1/4] tools/nolibc/string: export strlen() Rodrigo Campos
2024-01-29 14:15 ` [PATCH 2/4] tools/nolibc: Fix strlcat() return code and size usage Rodrigo Campos
2024-02-11 10:48 ` Willy Tarreau
2024-02-12 23:16 ` Rodrigo Campos
2024-02-13 5:27 ` Rodrigo Campos
2024-02-13 6:20 ` Rodrigo Campos
2024-02-13 7:02 ` Willy Tarreau
2024-02-14 15:19 ` Rodrigo Campos
2024-02-13 6:04 ` Rodrigo Campos
2024-02-14 15:34 ` Rodrigo Campos
2024-02-14 22:03 ` Rodrigo Campos
2024-02-14 22:47 ` Rodrigo Campos
2024-02-18 10:22 ` Willy Tarreau
2024-02-18 10:20 ` Willy Tarreau
2024-02-18 19:33 ` Rodrigo Campos
2024-01-29 14:15 ` [PATCH 3/4] tools/nolibc: Fix strlcpy() " Rodrigo Campos
2024-02-11 11:08 ` Willy Tarreau [this message]
2024-02-11 11:14 ` Willy Tarreau
2024-02-14 15:50 ` Rodrigo Campos
2024-02-14 15:55 ` Willy Tarreau
2024-01-29 14:15 ` [PATCH 4/4] selftests/nolibc: Add tests for strlcat() and strlcpy() Rodrigo Campos
2024-02-11 11:09 ` Willy Tarreau
2024-02-14 15:52 ` Rodrigo Campos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240211110814.GB19364@1wt.eu \
--to=w@1wt.eu \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@weissschuh.net \
--cc=rodrigo@sdfg.com.ar \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox