mirror of
https://github.com/espressif/esp-idf.git
synced 2026-09-22 04:58:43 +03:00
The check that rejects moving a directory into its own subtree was tied to CONFIG_FATFS_VFS_RENAME_REPLACES_DESTINATION, so a build that only wanted POSIX replacement semantics got the guard as a side effect, and the default build kept the exposure the guard exists for: f_rename() does not detect the case and links the directory into its own tree, after which the directory is reachable only from inside itself and the volume is corrupt. The two behaviours are unrelated, so give the guard its own option, CONFIG_FATFS_VFS_RENAME_REJECTS_SELF_NESTING (default n), and let either be enabled without the other. Resolve the destination by start cluster rather than comparing path bytes. FatFs matches names through directory entries, so a destination spelled as an 8.3 alias, or differing only in the case of a non-ASCII character, denotes the same directory as the source and slipped past the previous string prefix check, which folded ASCII case only. Long file names are enabled by default, so the aliases exist in the default configuration. The walk runs only when the source is a directory, leaving a file rename one directory open that fails immediately. Fold the two conditional variants of vfs_fat_rename() into a single implementation. The variant guarded by the replace option had lost the stat cache invalidation the unguarded one performs, so a readdir-cached entry could answer a later stat() for a path that had just been renamed; the invalidation now applies to every configuration. Co-authored-by: Cursor <cursoragent@cursor.com>
2 lines
47 B
Plaintext
2 lines
47 B
Plaintext
CONFIG_FATFS_VFS_RENAME_REJECTS_SELF_NESTING=y
|