From 470864e06510d42be0880479c07ea2aeb440942c Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Mon, 23 Dec 2024 18:36:31 +0100 Subject: [PATCH 1/7] lib/string/ctype/isascii.h: ispfchar_c(): Add macro This function returns true if the input character is a character from the POSIX portable filename character set. Link: Signed-off-by: Alejandro Colomar --- lib/string/ctype/isascii.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/string/ctype/isascii.h b/lib/string/ctype/isascii.h index 6500717c6a..85863bcf0d 100644 --- a/lib/string/ctype/isascii.h +++ b/lib/string/ctype/isascii.h @@ -30,6 +30,7 @@ #define CTYPE_PRINT_C CTYPE_GRAPH_C " " #define CTYPE_XDIGIT_C CTYPE_DIGIT_C "abcdefABCDEF" #define CTYPE_ASCII_C CTYPE_PRINT_C CTYPE_CNTRL_C /*NUL*/ +#define CTYPE_PFCHAR_C CTYPE_ALNUM_C "._-" // portable filename character set // isascii_c - is [:ascii:] C-locale @@ -45,6 +46,7 @@ #define isgraph_c(c) (!streq(strchrnul(CTYPE_GRAPH_C, c), "")) #define isprint_c(c) (!streq(strchrnul(CTYPE_PRINT_C, c), "")) #define isxdigit_c(c) (!streq(strchrnul(CTYPE_XDIGIT_C, c), "")) +#define ispfchar_c(c) (!streq(strchrnul(CTYPE_PFCHAR_C, c), "")) // strisascii_c - string is [:ascii:] C-locale From cd6ff74b11635530ffc8e2eedab7ddad691fd0e7 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Mon, 23 Dec 2024 15:25:48 +0100 Subject: [PATCH 2/7] lib/chkname.c: is_valid_name(): Use isalnum_c() instead of its pattern Signed-off-by: Alejandro Colomar --- lib/chkname.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/chkname.c b/lib/chkname.c index ee8ff9d108..7c07a4fa1b 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -75,9 +75,7 @@ is_valid_name(const char *name) * sake of Samba 3.x "add machine script" */ - if (!((*name >= 'a' && *name <= 'z') || - (*name >= 'A' && *name <= 'Z') || - (*name >= '0' && *name <= '9') || + if (!(isalnum_c(*name) || *name == '_' || *name == '.')) { @@ -86,9 +84,7 @@ is_valid_name(const char *name) } while (!streq(++name, "")) { - if (!((*name >= 'a' && *name <= 'z') || - (*name >= 'A' && *name <= 'Z') || - (*name >= '0' && *name <= '9') || + if (!(isalnum_c(*name) || *name == '_' || *name == '.' || *name == '-' || From e81736c0a8cc5593ec8d2b397156cf666afca77b Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Mon, 23 Dec 2024 17:30:57 +0100 Subject: [PATCH 3/7] lib/chkname.c: is_valid_name(): Split Samba check Signed-off-by: Alejandro Colomar --- lib/chkname.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/chkname.c b/lib/chkname.c index 7c07a4fa1b..fe04386071 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -84,11 +84,13 @@ is_valid_name(const char *name) } while (!streq(++name, "")) { + if (streq(name, "$")) // Samba + return true; + if (!(isalnum_c(*name) || *name == '_' || *name == '.' || - *name == '-' || - streq(name, "$") + *name == '-' )) { errno = EILSEQ; From 721567e137de47b9503c66a5d10b4659178c0946 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Mon, 23 Dec 2024 18:41:06 +0100 Subject: [PATCH 4/7] lib/chkname.c: is_valid_name(): Use ispfchar_c() to simplify In the first case, we can do the transformation because a few lines above, we explicitly reject a name starting with a '-'. In the second case, we're obviously using ispfchar_c() instead of its pattern. Signed-off-by: Alejandro Colomar --- lib/chkname.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/chkname.c b/lib/chkname.c index fe04386071..efb660a8d6 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -75,10 +75,7 @@ is_valid_name(const char *name) * sake of Samba 3.x "add machine script" */ - if (!(isalnum_c(*name) || - *name == '_' || - *name == '.')) - { + if (!ispfchar_c(*name)) { errno = EILSEQ; return false; } @@ -87,12 +84,7 @@ is_valid_name(const char *name) if (streq(name, "$")) // Samba return true; - if (!(isalnum_c(*name) || - *name == '_' || - *name == '.' || - *name == '-' - )) - { + if (!ispfchar_c(*name)) { errno = EILSEQ; return false; } From 97fd538ffe771a1bdc40b706b57e44c1109ed333 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 20 Jun 2026 22:18:57 +0200 Subject: [PATCH 5/7] lib/string/ctype/isascii.h: Increase white-space alignment This is in preparation for the next commit. Signed-off-by: Alejandro Colomar --- lib/string/ctype/isascii.h | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/string/ctype/isascii.h b/lib/string/ctype/isascii.h index 85863bcf0d..86956d9239 100644 --- a/lib/string/ctype/isascii.h +++ b/lib/string/ctype/isascii.h @@ -19,43 +19,43 @@ "\x1F\x1E\x1D\x1C\x1B\x1A\x19\x18\x17\x16\x15\x14\x13\x12\x11\x10" \ "\x0F\x0E\x0D\x0C\x0B\x0A\x09\x08\x07\x06\x05\x04\x03\x02\x01" /*NUL*/ -#define CTYPE_LOWER_C "abcdefghijklmnopqrstuvwxyz" -#define CTYPE_UPPER_C "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define CTYPE_DIGIT_C "0123456789" -#define CTYPE_PUNCT_C "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" -#define CTYPE_SPACE_C " \t\n\v\f\r" -#define CTYPE_ALPHA_C CTYPE_LOWER_C CTYPE_UPPER_C -#define CTYPE_ALNUM_C CTYPE_ALPHA_C CTYPE_DIGIT_C -#define CTYPE_GRAPH_C CTYPE_ALNUM_C CTYPE_PUNCT_C -#define CTYPE_PRINT_C CTYPE_GRAPH_C " " -#define CTYPE_XDIGIT_C CTYPE_DIGIT_C "abcdefABCDEF" -#define CTYPE_ASCII_C CTYPE_PRINT_C CTYPE_CNTRL_C /*NUL*/ -#define CTYPE_PFCHAR_C CTYPE_ALNUM_C "._-" // portable filename character set +#define CTYPE_LOWER_C "abcdefghijklmnopqrstuvwxyz" +#define CTYPE_UPPER_C "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define CTYPE_DIGIT_C "0123456789" +#define CTYPE_PUNCT_C "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" +#define CTYPE_SPACE_C " \t\n\v\f\r" +#define CTYPE_ALPHA_C CTYPE_LOWER_C CTYPE_UPPER_C +#define CTYPE_ALNUM_C CTYPE_ALPHA_C CTYPE_DIGIT_C +#define CTYPE_GRAPH_C CTYPE_ALNUM_C CTYPE_PUNCT_C +#define CTYPE_PRINT_C CTYPE_GRAPH_C " " +#define CTYPE_XDIGIT_C CTYPE_DIGIT_C "abcdefABCDEF" +#define CTYPE_ASCII_C CTYPE_PRINT_C CTYPE_CNTRL_C /*NUL*/ +#define CTYPE_PFCHAR_C CTYPE_ALNUM_C "._-" // portable filename character set // isascii_c - is [:ascii:] C-locale -#define isascii_c(c) (!!strchr(CTYPE_ASCII_C, c)) -#define iscntrl_c(c) (!!strchr(CTYPE_CNTRL_C, c)) -#define islower_c(c) (!streq(strchrnul(CTYPE_LOWER_C, c), "")) -#define isupper_c(c) (!streq(strchrnul(CTYPE_UPPER_C, c), "")) -#define isdigit_c(c) (!streq(strchrnul(CTYPE_DIGIT_C, c), "")) -#define ispunct_c(c) (!streq(strchrnul(CTYPE_PUNCT_C, c), "")) -#define isspace_c(c) (!streq(strchrnul(CTYPE_SPACE_C, c), "")) -#define isalpha_c(c) (!streq(strchrnul(CTYPE_ALPHA_C, c), "")) -#define isalnum_c(c) (!streq(strchrnul(CTYPE_ALNUM_C, c), "")) -#define isgraph_c(c) (!streq(strchrnul(CTYPE_GRAPH_C, c), "")) -#define isprint_c(c) (!streq(strchrnul(CTYPE_PRINT_C, c), "")) -#define isxdigit_c(c) (!streq(strchrnul(CTYPE_XDIGIT_C, c), "")) -#define ispfchar_c(c) (!streq(strchrnul(CTYPE_PFCHAR_C, c), "")) +#define isascii_c(c) (!!strchr(CTYPE_ASCII_C, c)) +#define iscntrl_c(c) (!!strchr(CTYPE_CNTRL_C, c)) +#define islower_c(c) (!streq(strchrnul(CTYPE_LOWER_C, c), "")) +#define isupper_c(c) (!streq(strchrnul(CTYPE_UPPER_C, c), "")) +#define isdigit_c(c) (!streq(strchrnul(CTYPE_DIGIT_C, c), "")) +#define ispunct_c(c) (!streq(strchrnul(CTYPE_PUNCT_C, c), "")) +#define isspace_c(c) (!streq(strchrnul(CTYPE_SPACE_C, c), "")) +#define isalpha_c(c) (!streq(strchrnul(CTYPE_ALPHA_C, c), "")) +#define isalnum_c(c) (!streq(strchrnul(CTYPE_ALNUM_C, c), "")) +#define isgraph_c(c) (!streq(strchrnul(CTYPE_GRAPH_C, c), "")) +#define isprint_c(c) (!streq(strchrnul(CTYPE_PRINT_C, c), "")) +#define isxdigit_c(c) (!streq(strchrnul(CTYPE_XDIGIT_C, c), "")) +#define ispfchar_c(c) (!streq(strchrnul(CTYPE_PFCHAR_C, c), "")) // strisascii_c - string is [:ascii:] C-locale -#define strisdigit_c(s) streq(stpspn(s, CTYPE_DIGIT_C), "") -#define strisprint_c(s) streq(stpspn(s, CTYPE_PRINT_C), "") +#define strisdigit_c(s) streq(stpspn(s, CTYPE_DIGIT_C), "") +#define strisprint_c(s) streq(stpspn(s, CTYPE_PRINT_C), "") // strchriscntrl_c - string character is [:cntrl:] C-locale -#define strchriscntrl_c(s) (!!strpbrk(s, CTYPE_CNTRL_C)) +#define strchriscntrl_c(s) (!!strpbrk(s, CTYPE_CNTRL_C)) #endif // include guard From a06e755548de214fb486b33fef34dcf067ec6f9f Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 20 Jun 2026 22:21:26 +0200 Subject: [PATCH 6/7] lib/string/ctype/isascii.h: Add variants for handling LDH from RFC1035 Link: Signed-off-by: Alejandro Colomar --- lib/string/ctype/isascii.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/string/ctype/isascii.h b/lib/string/ctype/isascii.h index 86956d9239..750289632f 100644 --- a/lib/string/ctype/isascii.h +++ b/lib/string/ctype/isascii.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024-2025, Alejandro Colomar +// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar // SPDX-License-Identifier: BSD-3-Clause @@ -31,6 +31,7 @@ #define CTYPE_XDIGIT_C CTYPE_DIGIT_C "abcdefABCDEF" #define CTYPE_ASCII_C CTYPE_PRINT_C CTYPE_CNTRL_C /*NUL*/ #define CTYPE_PFCHAR_C CTYPE_ALNUM_C "._-" // portable filename character set +#define CTYPE_LDH_RFC1035_C CTYPE_ALNUM_C "-" // letter, digit, hyphen // isascii_c - is [:ascii:] C-locale @@ -47,11 +48,13 @@ #define isprint_c(c) (!streq(strchrnul(CTYPE_PRINT_C, c), "")) #define isxdigit_c(c) (!streq(strchrnul(CTYPE_XDIGIT_C, c), "")) #define ispfchar_c(c) (!streq(strchrnul(CTYPE_PFCHAR_C, c), "")) +#define isldh_rfc1035_c(c) (!streq(strchrnul(CTYPE_LDH_RFC1035_C, c), "")) // strisascii_c - string is [:ascii:] C-locale #define strisdigit_c(s) streq(stpspn(s, CTYPE_DIGIT_C), "") #define strisprint_c(s) streq(stpspn(s, CTYPE_PRINT_C), "") +#define strisldh_rfc1035_c(s) streq(stpspn(s, CTYPE_LDH_RFC1035_C), "") // strchriscntrl_c - string character is [:cntrl:] C-locale From 188d2acc08306c05bba7a0635248324f075c8372 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 20 Jun 2026 22:23:42 +0200 Subject: [PATCH 7/7] lib/chkname.c: Use strisldh_rfc1035_c() instead of its pattern Signed-off-by: Alejandro Colomar --- lib/chkname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chkname.c b/lib/chkname.c index efb660a8d6..262ca811ec 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -136,7 +136,7 @@ is_valid_domain_label(const char *label) errno = EINVAL; return false; } - if (!streq(stpspn(label, CTYPE_ALNUM_C "-"), "")) { + if (!strisldh_rfc1035_c(label)) { errno = EINVAL; return false; }