diff --git a/lib/chkname.c b/lib/chkname.c index ee8ff9d108..262ca811ec 100644 --- a/lib/chkname.c +++ b/lib/chkname.c @@ -75,26 +75,16 @@ 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') || - *name == '_' || - *name == '.')) - { + if (!ispfchar_c(*name)) { errno = EILSEQ; return false; } while (!streq(++name, "")) { - if (!((*name >= 'a' && *name <= 'z') || - (*name >= 'A' && *name <= 'Z') || - (*name >= '0' && *name <= '9') || - *name == '_' || - *name == '.' || - *name == '-' || - streq(name, "$") - )) - { + if (streq(name, "$")) // Samba + return true; + + if (!ispfchar_c(*name)) { errno = EILSEQ; return false; } @@ -146,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; } diff --git a/lib/string/ctype/isascii.h b/lib/string/ctype/isascii.h index 6500717c6a..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 @@ -19,41 +19,46 @@ "\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_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_LDH_RFC1035_C CTYPE_ALNUM_C "-" // letter, digit, hyphen // 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 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 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 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 -#define strchriscntrl_c(s) (!!strpbrk(s, CTYPE_CNTRL_C)) +#define strchriscntrl_c(s) (!!strpbrk(s, CTYPE_CNTRL_C)) #endif // include guard