fs: fat: remove trailing periods from long name
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 30 Jan 2021 13:12:10 +0000 (14:12 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 3 Feb 2021 10:41:02 +0000 (11:41 +0100)
The FAT32 File System Specification [1] requires leading and trailing
spaces as well as trailing periods of long names to be ignored.

[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@gmx.de>
fs/fat/fat_write.c

index 8945649..8ff2f6d 100644 (file)
@@ -1237,12 +1237,38 @@ 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)
+               ;
+
+       /* Keep special entries '.' and '..' */
+       if (filename[0] == '.' &&
+           (!filename[1] || (filename[1] == '.' && !filename[2])))
+               goto done;
+
+       /* 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;
 }