From d50ab07938ed3bfe4af7ec23798599d83a9e00f8 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 16 Mar 2017 15:12:20 +0100 Subject: 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 36c963d9ef..dec894f133 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 7d8dfc15b7..6ecb7f24dc 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 @@ -192,6 +192,15 @@ static const name_duplicates DIRECTORY_DUPLICATES[ "Shrtdir" } }, + { + "Kurzdir", + 3, + { + "kurzdir", + "KURZDIR", + "Kurzdir" + } + }, { "long_conventional_dir", 3, -- cgit v1.2.3