Normalization is identity, but casefold can be implemented with toupper or tolower, and we have no specification on that. We should be safe, as long as it is constant. Signed-off-by: Gabriel Krisman Bertazi <krisman@xxxxxxxxxxxxxxx> --- fs/nls/nls_ascii.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/fs/nls/nls_ascii.c b/fs/nls/nls_ascii.c index 2f4826478d3d..40b8e7acfe1e 100644 --- a/fs/nls/nls_ascii.c +++ b/fs/nls/nls_ascii.c @@ -12,6 +12,7 @@ #include <linux/string.h> #include <linux/nls.h> #include <linux/errno.h> +#include <linux/slab.h> static const wchar_t charset2uni[256] = { /* 0x00*/ @@ -152,11 +153,43 @@ static unsigned char charset_toupper(const struct nls_table *table, return charset2upper[c]; } +/* Ascii casefold can be defined as either to lower or to upper. As long + * as it is stable. */ +static int ascii_casefold(const struct nls_table *charset, + const unsigned char *str, size_t len, + unsigned char *dest, size_t dlen) +{ + unsigned int i; + + if (dlen < len) + return -EINVAL; + + for (i = 0; i < len; i++) + dest[i] = charset_tolower(charset, str[i]); + + return 0; +} + +/* Ascii normalization is identity. */ +static int ascii_normalize(const struct nls_table *charset, + const unsigned char *str, size_t len, + unsigned char *dest, size_t dlen) +{ + if (dlen < len) + return -EINVAL; + + memcpy(dest, str, len); + + return 0; +} + static const struct nls_ops charset_ops = { .lowercase = charset_toupper, .uppercase = charset_tolower, .uni2char = uni2char, .char2uni = char2uni, + .casefold = ascii_casefold, + .normalize = ascii_normalize, }; static struct nls_charset nls_charset; -- 2.18.0