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.g...@gmx.de>
---
v2:
        special treatment of '.' and '..'
---
 fs/fat/fat_write.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)

diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index 8945649977..8ff2f6def0 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -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;
 }

--
2.30.0

Reply via email to