Attention is currently required from: Yu-Ping Wu.
Hello Yu-Ping Wu,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/83933?usp=email
to review the following change.
Change subject: commonlib/bsd: Optimize strnlen() ......................................................................
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 --- M src/commonlib/bsd/string.c 1 file changed, 13 insertions(+), 4 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/33/83933/1
diff --git a/src/commonlib/bsd/string.c b/src/commonlib/bsd/string.c index 56670e8..461c040 100644 --- a/src/commonlib/bsd/string.c +++ b/src/commonlib/bsd/string.c @@ -15,10 +15,19 @@
size_t strnlen(const char *str, size_t maxlen) { - size_t len = 0; - while (*str++ && len < maxlen) - len++; - return len; + const char *ptr = str; + const char *end = str + maxlen; + + 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 ptr - str; + } + return ptr - str - 1; }
char *strcat(char *dst, const char *src)