commonlib/bsd: Optimize strnlen()

This patch changes the strnlen() implementation to fix a small issue
where we would dereference once more byte than intended when not finding
a NUL-byte within the specified amount of characters. It also changes
the implementation to rely on a pre-calculated end pointer rather than a
running counter, since this seems to lead to slightly better assembly
(one less instruction in the inner loop) on most architectures.

Change-Id: Ic36768fd3a26e2b64143904e78cd0b52ba66898d
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/83933
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
Julius Werner
2024-08-15 13:43:12 -07:00
committed by Felix Held
parent 82c0dd2909
commit f9ab107d32

View File

@@ -15,10 +15,19 @@ size_t strlen(const char *str)
size_t strnlen(const char *str, size_t maxlen) size_t strnlen(const char *str, size_t maxlen)
{ {
size_t len = 0; const char *ptr = str;
while (*str++ && len < maxlen) const char *end = str + maxlen;
len++;
return len; if (!maxlen)
return 0;
while (*ptr++) {
/* Make sure this checks for ==, not >=, because the calculation
for `end` may overflow in some edge cases. */
if (ptr == end)
return maxlen;
}
return ptr - str - 1;
} }
char *strcat(char *dst, const char *src) char *strcat(char *dst, const char *src)