[PATCH 4/4] fs: fat: remove trailing periods from long name
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Jan 31 00:09:53 CET 2021
The FAT32 File System Specification [1] requires leading and trailing
spaces as well as trailing periods of long names to be ignored.
This renders a test for '.' and '..' as file name superfluous.
But we must check that the resulting name has at least one character.
[1]
Microsoft Extensible Firmware Initiative
FAT32 File System Specification
Version 1.03, December 6, 2000
Microsoft Corporation
https://www.win.tue.nl/~aeb/linux/fs/fat/fatgen103.pdf
Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
fs/fat/fat_write.c | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index 0f4786ef0f..1b0a0eda09 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -1237,12 +1237,32 @@ again:
}
*last_slash_cont = '\0';
- *basename = last_slash_cont + 1;
+ filename = last_slash_cont + 1;
} else {
*dirname = "/"; /* root by default */
- *basename = filename;
}
+ /*
+ * The FAT32 File System Specification v1.03 requires leading and
+ * trailing spaces as well as trailing periods to be ignored.
+ */
+ for (; *filename == ' '; ++filename)
+ ;
+ /* Remove trailing periods and spaces */
+ for (p = filename + strlen(filename) - 1; p >= filename; --p) {
+ switch (*p) {
+ case ' ':
+ case '.':
+ *p = 0;
+ break;
+ default:
+ goto done;
+ }
+ }
+
+done:
+ *basename = filename;
+
return 0;
}
@@ -1260,10 +1280,7 @@ static int normalize_longname(char *l_filename, const char *filename)
{
const char *p, illegal[] = "<>:\"/\\|?*";
- if (!strcmp(filename, ".") || !strcmp(filename, ".."))
- return -1;
-
- if (strlen(filename) >= VFAT_MAXLEN_BYTES)
+ if (!*filename || strlen(filename) >= VFAT_MAXLEN_BYTES)
return -1;
for (p = filename; *p; ++p) {
--
2.29.2
More information about the U-Boot
mailing list