[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