diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-01-03 09:09:41 +0000 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-01-03 09:10:22 +0000 |
| commit | f86148d2777d4d7985ed8f4ae957c41c44bd2484 (patch) | |
| tree | 59ed6a845d327559c99ca3c2e21e663159f99621 | |
| parent | 3642ba2a9840734d83dd77ca4c1aa0ecb3bfe879 (diff) | |
linuxkpi: Correct kstrtobool
Implement the exact same logic as in Linux:
* Accept 'e', 't', 'y', '1', "on" for true.
* Accept 'd', 'f', 'n', '0', "of" for false.
* Disregard any characters beyond that.
* Check that the string is not null, but don't check the result pointer.
MFC after: 1 week
Sponsored by: Klara, Inc.
Sponsored by: NetApp, Inc.
Reviewed by: bz, emaste
Differential Revision: https://reviews.freebsd.org/D54451
| -rw-r--r-- | sys/compat/linuxkpi/common/include/linux/kstrtox.h | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/kstrtox.h b/sys/compat/linuxkpi/common/include/linux/kstrtox.h index 6a145c409038..05bf94dd375d 100644 --- a/sys/compat/linuxkpi/common/include/linux/kstrtox.h +++ b/sys/compat/linuxkpi/common/include/linux/kstrtox.h @@ -249,22 +249,16 @@ kstrtoull(const char *cp, unsigned int base, unsigned long long *res) static inline int kstrtobool(const char *s, bool *res) { - size_t len; - - if (s == NULL || (len = strlen(s)) == 0 || res == NULL) + if (s == NULL || *s == '\0') return (-EINVAL); - /* skip newline character, if any */ - if (s[len - 1] == '\n') - len--; - - if (len == 1 && strchr("yY1", s[0]) != NULL) + if (strchr("eEtTyY1", s[0]) != NULL) *res = true; - else if (len == 1 && strchr("nN0", s[0]) != NULL) + else if (strchr("dDfFnN0", s[0]) != NULL) *res = false; - else if (strncasecmp("on", s, len) == 0) + else if (strncasecmp("on", s, 2) == 0) *res = true; - else if (strncasecmp("off", s, len) == 0) + else if (strncasecmp("of", s, 2) == 0) *res = false; else return (-EINVAL); |
