Fix directory look up.
authorCharles Manning <cdhmanning@gmail.com>
Tue, 19 May 2015 22:21:52 +0000 (10:21 +1200)
committerCharles Manning <cdhmanning@gmail.com>
Tue, 19 May 2015 22:21:52 +0000 (10:21 +1200)
Thanks to Trent Lillehaugen for new algorithm:

Let's say I have two yaffs partitions: "/" and "/foo".
If I call, yaffs_mkdir("/foobar", 0), yaffsfs_FindDevice will match the path
with the "/foo" partition.  I would expect it to match "/" instead.
It will also match "/fo/o/bar" with "/foo", again I think it should match
with "/".

Signed-off-by: Charles Manning <cdhmanning@gmail.com>
direct/yaffsfs.c

index 69cf0a48ad9e424d7fc53890683cc1af61682e87..dedd76ca08138e26bb0b0c9573f53111a7e36652 100644 (file)
@@ -515,17 +515,17 @@ static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
                thisMatchLength = 0;
                matching = 1;
 
+
                if(!p)
                        continue;
 
-               while (matching && *p && *leftOver) {
-                       /* Skip over any /s */
-                       while (yaffsfs_IsPathDivider(*p))
-                               p++;
+               /* Skip over any leading  /s */
+               while (yaffsfs_IsPathDivider(*p))
+                       p++;
+               while (yaffsfs_IsPathDivider(*leftOver))
+                       leftOver++;
 
-                       /* Skip over any /s */
-                       while (yaffsfs_IsPathDivider(*leftOver))
-                               leftOver++;
+               while (matching && *p && *leftOver) {
 
                        /* Now match the text part */
                        while (matching &&
@@ -539,6 +539,16 @@ static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
                                        matching = 0;
                                }
                        }
+
+                       if ((*p && !yaffsfs_IsPathDivider(*p)) ||
+                           (*leftOver && !yaffsfs_IsPathDivider(*leftOver)))
+                               matching = 0;
+                       else {
+                               while (yaffsfs_IsPathDivider(*p))
+                                       p++;
+                               while (yaffsfs_IsPathDivider(*leftOver))
+                                       leftOver++;
+                       }
                }
 
                /* Skip over any /s in leftOver */
@@ -559,7 +569,6 @@ static struct yaffs_dev *yaffsfs_FindDevice(const YCHAR *path,
                        retval = dev;
                        longestMatch = thisMatchLength;
                }
-
        }
        return retval;
 }