diff options
author | Heinrich Schuchardt | 2019-05-12 09:59:18 +0200 |
---|---|---|
committer | Tom Rini | 2019-05-28 13:57:52 -0400 |
commit | 7b437807ee0a051f46d329e868e0295299026b75 (patch) | |
tree | 54c02dd9283899748a6b65470cfeb30c3b078ece /fs | |
parent | 7c7919cd07b34a784ab321ab7578106c9e9bd753 (diff) |
fs: fat: correct file name normalization
File names may not contain control characters (< 0x20).
Simplify the coding.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fat/fat_write.c | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 852f874e581..2a74199236d 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -1009,40 +1009,32 @@ again: return 0; } +/** + * normalize_longname() - check long file name and convert to lower case + * + * We assume here that the FAT file system is using an 8bit code page. + * Linux typically uses CP437, EDK2 assumes CP1250. + * + * @l_filename: preallocated buffer receiving the normalized name + * @filename: filename to normalize + * Return: 0 on success, -1 on failure + */ static int normalize_longname(char *l_filename, const char *filename) { - const char *p, legal[] = "!#$%&\'()-.@^`_{}~"; - unsigned char c; - int name_len; - - /* Check that the filename is valid */ - for (p = filename; p < filename + strlen(filename); p++) { - c = *p; - - if (('0' <= c) && (c <= '9')) - continue; - if (('A' <= c) && (c <= 'Z')) - continue; - if (('a' <= c) && (c <= 'z')) - continue; - if (strchr(legal, c)) - continue; - /* extended code */ - if ((0x80 <= c) && (c <= 0xff)) - continue; + const char *p, illegal[] = "<>:\"/\\|?*"; + if (strlen(filename) >= VFAT_MAXLEN_BYTES) return -1; - } - /* Normalize it */ - name_len = strlen(filename); - if (name_len >= VFAT_MAXLEN_BYTES) - /* should return an error? */ - name_len = VFAT_MAXLEN_BYTES - 1; + for (p = filename; *p; ++p) { + if ((unsigned char)*p < 0x20) + return -1; + if (strchr(illegal, *p)) + return -1; + } - memcpy(l_filename, filename, name_len); - l_filename[name_len] = 0; /* terminate the string */ - downcase(l_filename, INT_MAX); + strcpy(l_filename, filename); + downcase(l_filename, VFAT_MAXLEN_BYTES); return 0; } |