Skip to content
22 changes: 6 additions & 16 deletions lib/chkname.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Comment thread
alejandro-colomar marked this conversation as resolved.
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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
59 changes: 32 additions & 27 deletions lib/string/ctype/isascii.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2024-2025, Alejandro Colomar <alx@kernel.org>
// SPDX-FileCopyrightText: 2024-2026, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause


Expand All @@ -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
Loading