summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChen Pei <cp0613@linux.alibaba.com>2026-03-06 17:44:25 +0800
committerAnup Patel <anup@brainfault.org>2026-04-06 17:53:33 +0530
commit2bf0de88c8897ff4be5b89c04115c17421ad5687 (patch)
tree8d503dc1c9ff16fc83aa0dbc056bcb2489d1df93
parentfdb78b0ec585a318ae6199c7129be389bf78091c (diff)
downloadopensbi-2bf0de88c8897ff4be5b89c04115c17421ad5687.tar.gz
opensbi-2bf0de88c8897ff4be5b89c04115c17421ad5687.zip
lib: Fix sbi_strchr to correctly handle null terminator search
The original sbi_strchr implementation did not conform to the C standard behavior. According to the C standard and POSIX specification, strchr(s, 0) should return a pointer to the null terminator at the end of string s. The previous implementation used a while loop that would terminate when either reaching the end of string or finding the character, but it would return NULL when searching for the null terminator instead of returning a pointer to the null terminator itself. The fixed implementation uses a do-while loop that ensures even when searching for the null terminator, the function correctly returns a pointer to the null terminator position rather than NULL. This fix ensures sbi_strchr behavior aligns with standard library function semantics, making it more predictable and safe for users expecting standard C library behavior. Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260306094425.1918-3-cp0613@linux.alibaba.com Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r--lib/sbi/sbi_string.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/lib/sbi/sbi_string.c b/lib/sbi/sbi_string.c
index f4f13942..3a10c254 100644
--- a/lib/sbi/sbi_string.c
+++ b/lib/sbi/sbi_string.c
@@ -88,13 +88,12 @@ char *sbi_strncpy(char *dest, const char *src, size_t count)
char *sbi_strchr(const char *s, int c)
{
- while (*s != '\0' && *s != (char)c)
- s++;
+ do {
+ if (*s == (char)c)
+ return (char *)s;
+ } while (*s++ != '\0');
- if (*s == '\0')
- return NULL;
- else
- return (char *)s;
+ return NULL;
}
char *sbi_strrchr(const char *s, int c)