fs: fat: handle "." and ".." of root dir correctly with fat_itr_resolve()
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Tue, 11 Sep 2018 06:58:59 +0000 (15:58 +0900)
committerAlexander Graf <agraf@suse.de>
Sun, 23 Sep 2018 19:55:29 +0000 (21:55 +0200)
FAT's root directory does not have "." nor ".."
So care must be taken when scanning root directory with fat_itr_resolve().
Without this patch, any file path starting with "." or ".." will not be
resolved at all.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
fs/fat/fat.c

index 5f921e8..c475f12 100644 (file)
@@ -931,6 +931,27 @@ static int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type)
        while (next[0] && !ISDIRDELIM(next[0]))
                next++;
 
+       if (itr->is_root) {
+               /* root dir doesn't have "." nor ".." */
+               if ((((next - path) == 1) && !strncmp(path, ".", 1)) ||
+                   (((next - path) == 2) && !strncmp(path, "..", 2))) {
+                       /* point back to itself */
+                       itr->clust = itr->fsdata->root_cluster;
+                       itr->dent = NULL;
+                       itr->remaining = 0;
+                       itr->last_cluster = 0;
+
+                       if (next[0] == 0) {
+                               if (type & TYPE_DIR)
+                                       return 0;
+                               else
+                                       return -ENOENT;
+                       }
+
+                       return fat_itr_resolve(itr, next, type);
+               }
+       }
+
        while (fat_itr_next(itr)) {
                int match = 0;
                unsigned n = max(strlen(itr->name), (size_t)(next - path));