[rtems commit] dosfs: Fix file name search

Sebastian Huber sebh at rtems.org
Thu Mar 16 14:36:46 UTC 2017


Module:    rtems
Branch:    master
Commit:    d50ab07938ed3bfe4af7ec23798599d83a9e00f8
Changeset: http://git.rtems.org/rtems/commit/?id=d50ab07938ed3bfe4af7ec23798599d83a9e00f8

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Mar 16 15:12:20 2017 +0100

dosfs: Fix file name search

Do not use our long file name entry count to optimize the file name
search. The Unicode comparison must be taken into account.

Update #2939.

---

 cpukit/libfs/src/dosfs/msdos_misc.c     | 24 +++++++-----------------
 testsuites/fstests/fsdosfsname01/init.c | 11 ++++++++++-
 2 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c
index 36c963d..dec894f 100644
--- a/cpukit/libfs/src/dosfs/msdos_misc.c
+++ b/cpukit/libfs/src/dosfs/msdos_misc.c
@@ -1441,6 +1441,9 @@ msdos_find_file_in_directory (
                 if ((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
                     MSDOS_ATTR_LFN)
                 {
+                    bool is_first_lfn_entry =
+                        (lfn_start.cln == FAT_FILE_SHORT_NAME);
+
 /*                    int   o;*/
 #if MSDOS_FIND_PRINT
                     printf ("MSFS:[4.2] lfn:%c entry:%i checksum:%i\n",
@@ -1452,7 +1455,7 @@ msdos_find_file_in_directory (
                      * If we are not already processing a LFN see if this is
                      * the first entry of a LFN ?
                      */
-                    if (lfn_start.cln == FAT_FILE_SHORT_NAME)
+                    if (is_first_lfn_entry)
                     {
                         entry_matched = false;
 
@@ -1464,23 +1467,10 @@ msdos_find_file_in_directory (
                              MSDOS_LAST_LONG_ENTRY) == 0)
                             continue;
 
-                        /*
-                         * Does the number of entries in the LFN directory
-                         * entry match the number we expect for this
-                         * file name. Note we do not know the number of
-                         * characters in the entry so this is check further
-                         * on when the characters are checked.
-                         */
-                        if (lfn_entries != (*MSDOS_DIR_ENTRY_TYPE(entry) &
-                                            MSDOS_LAST_LONG_ENTRY_MASK))
-                            continue;
-
-                        /*
-                         * Get the checksum of the short entry.
-                         */
                         lfn_start.cln = dir_offset;
                         lfn_start.ofs = dir_entry;
-                        lfn_entry = lfn_entries;
+                        lfn_entry = (*MSDOS_DIR_ENTRY_TYPE(entry)
+                            & MSDOS_LAST_LONG_ENTRY_MASK);
                         lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
 
 #if MSDOS_FIND_PRINT
@@ -1513,7 +1503,7 @@ msdos_find_file_in_directory (
                     bytes_in_entry = msdos_long_entry_to_utf8_name (
                         converter,
                         entry,
-                        (lfn_entry + 1) == lfn_entries,
+                        is_first_lfn_entry,
                         &entry_utf8_normalized[0],
                         sizeof (entry_utf8_normalized));
                     if (bytes_in_entry > 0) {
diff --git a/testsuites/fstests/fsdosfsname01/init.c b/testsuites/fstests/fsdosfsname01/init.c
index 7d8dfc1..6ecb7f2 100644
--- a/testsuites/fstests/fsdosfsname01/init.c
+++ b/testsuites/fstests/fsdosfsname01/init.c
@@ -50,7 +50,7 @@ const char rtems_test_name[] = "FSDOSFSNAME 1";
 #define NUMBER_OF_DIRECTORIES 8
 #define NUMBER_OF_FILES 13
 #define NUMBER_OF_DIRECTORIES_INVALID 25
-#define NUMBER_OF_DIRECTORIES_DUPLICATED 2
+#define NUMBER_OF_DIRECTORIES_DUPLICATED 3
 #define NUMBER_OF_MULTIBYTE_NAMES_DUPLICATED 2
 #define NUMBER_OF_FILES_DUPLICATED 2
 #define NUMBER_OF_NAMES_MULTIBYTE 10
@@ -193,6 +193,15 @@ static const name_duplicates DIRECTORY_DUPLICATES[
     }
   },
   {
+    "Kurzdir",
+    3,
+    {
+      "kurzdir",
+      "KURZDIR",
+      "Kurzdir"
+    }
+  },
+  {
     "long_conventional_dir",
     3,
     {




More information about the vc mailing list