]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Revert "strchriscntrl: reject C1 control bytes (0x80-0x9F)"
authorAlejandro Colomar <alx@kernel.org>
Wed, 25 Mar 2026 21:00:40 +0000 (22:00 +0100)
committerSerge Hallyn <serge@hallyn.com>
Wed, 1 Apr 2026 14:27:30 +0000 (09:27 -0500)
C1 control bytes are more complicated than that.  They're represented as
two bytes in UTF-8.

Commit 19d725da, has issues, rejecting otherwise valid UTF-8 multi-byte
characters.

We could in theory do correct parsing of UTF, possibly parsing the
multi-byte sequences, or translating to wchar_t.  However, that would
complicate the source code well beyond what I'd be comfortable with.

Instead, let's revert this, and claim no intention to support UTF-8.
If an admin uses a UTF-8 locale while reading /etc/passwd, that's their
own fault.

Reverts: 19d725da (2026-03-13; "strchriscntrl: reject C1 control bytes (0x80-0x9F)")
Fixes: 19d725da (2026-03-13; "strchriscntrl: reject C1 control bytes (0x80-0x9F)")
Closes: <https://github.com/shadow-maint/shadow/issues/1598>
Reported-by: Mantas Mikulėnas <grawity@gmail.com>
Cc: KhaelK-Praetorian <khael.kugler@praetorian.com>
Cc: Tobias Stoeckmann <tobias@stoeckmann.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/string/ctype/strchrisascii/strchriscntrl.h

index aefa7c9cfce0f4ad50f86eb1acf2a335e974fc13..a1eaca371e65738372d3ab44f1b4d64cee7ab23a 100644 (file)
@@ -18,10 +18,7 @@ inline bool strchriscntrl(const char *s);
 
 
 // string character is [:cntrl:]
-// Return true if any control character is found in the string.
-// Check both C0 (0x00-0x1F, 0x7F) via iscntrl(3) and C1 (0x80-0x9F)
-// explicitly, since glibc's iscntrl() does not classify C1 bytes as
-// control characters in any locale.
+// Return true if any iscntrl(3) character is found in the string.
 inline bool
 strchriscntrl(const char *s)
 {
@@ -30,8 +27,6 @@ strchriscntrl(const char *s)
 
                if (iscntrl(c))
                        return true;
-               if (c >= 0x80 && c <= 0x9F)
-                       return true;
        }
 
        return false;