The _strip() function passes a char directly to isspace(), which is
undefined behavior. The ctype functions require an int argument that is
either an unsigned char value or EOF, but char is signed by default on
x86 and ARM, so any byte >= 0x80 in the input is promoted to a negative
int and indexes the ctype table out of bounds.
Such bytes are reachable from a user-provided config file containing
UTF-8 or other non-ASCII content.
Cast the argument to unsigned char, as is already done in
app/test-bbdev/test_bbdev_vector.c and elsewhere.
Fixes: eaafbad419bf ("cfgfile: library to interpret config files")
Cc: [email protected]
Signed-off-by: Wei Chen <[email protected]>
---
lib/cfgfile/rte_cfgfile.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/lib/cfgfile/rte_cfgfile.c b/lib/cfgfile/rte_cfgfile.c
index 6edd83b5b3..958cec6672 100644
--- a/lib/cfgfile/rte_cfgfile.c
+++ b/lib/cfgfile/rte_cfgfile.c
@@ -97,16 +97,16 @@ _strip(char *str, unsigned len)
if (len == 0)
return 0;
- if (isspace(str[len-1])) {
+ if (isspace((unsigned char)str[len-1])) {
/* strip trailing whitespace */
- while (newlen > 0 && isspace(str[newlen - 1]))
+ while (newlen > 0 && isspace((unsigned char)str[newlen - 1]))
str[--newlen] = '\0';
}
- if (isspace(str[0])) {
+ if (isspace((unsigned char)str[0])) {
/* strip leading whitespace */
int i, start = 1;
- while (isspace(str[start]) && start < newlen)
+ while (isspace((unsigned char)str[start]) && start < newlen)
start++
; /* do nothing */
newlen -= start;
--
2.33.0.windows.2