You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2026/10/26 15:02:08 UTC
(mynewt-core) 05/07: libc/baselibc: Fix sscanf character set conversion
This is an automated email from the ASF dual-hosted git repository.
sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 880fe222c6a64864e4235d8014a9202f00dba825
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Sun Oct 25 23:23:27 2026 +0100
libc/baselibc: Fix sscanf character set conversion
Field width was ignored for %[ conversion, so all matching input
characters were stored regardless of buffer size given by width.
Ranges in character set, e.g. %[a-z], started at '-' instead of the
character preceding it and did not include the last character.
Assisted-by: Claude:claude-opus-5-5
---
libc/baselibc/src/vsscanf.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libc/baselibc/src/vsscanf.c b/libc/baselibc/src/vsscanf.c
index ddd3d7e91..bc631fb57 100644
--- a/libc/baselibc/src/vsscanf.c
+++ b/libc/baselibc/src/vsscanf.c
@@ -343,6 +343,7 @@ int vsscanf(const char *buffer, const char *format, va_list ap)
matchinv = 1;
} else {
set_bit(matchmap, (unsigned char)ch);
+ range_start = (unsigned char)ch;
state = st_match;
}
break;
@@ -351,10 +352,11 @@ int vsscanf(const char *buffer, const char *format, va_list ap)
if (ch == ']') {
goto match_run;
} else if (ch == '-') {
- range_start = (unsigned char)ch;
+ /* range_start holds previous character */
state = st_match_range;
} else {
set_bit(matchmap, (unsigned char)ch);
+ range_start = (unsigned char)ch;
}
break;
@@ -365,9 +367,10 @@ int vsscanf(const char *buffer, const char *format, va_list ap)
goto match_run;
} else {
int i;
- for (i = range_start; i < (unsigned char)ch;
+ for (i = range_start; i <= (unsigned char)ch;
i++)
set_bit(matchmap, i);
+ range_start = (unsigned char)ch;
state = st_match;
}
break;
@@ -380,6 +383,7 @@ int vsscanf(const char *buffer, const char *format, va_list ap)
if (sarg)
*sarg++ = uc;
q++;
+ width--;
}
if (q != qq && sarg) {
*sarg = '\0';