diff options
author | Christian Mauderer <Christian.Mauderer@embedded-brains.de> | 2017-11-28 16:42:00 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-12-05 08:02:42 +0100 |
commit | 004a63efef768583d872f3d5d45d008c7b597dc6 (patch) | |
tree | 23c24160ee65e87aa1e66b7b62ef99afe15ba637 | |
parent | c139a705979600f7e959ff8d58f6dc44ab80faa9 (diff) |
dosfs: Fix files with same name as volume name.
Take care that a file in the root directory with the same name as the
volume name can be found.
Close #3257.
-rw-r--r-- | cpukit/libfs/src/dosfs/msdos_misc.c | 3 | ||||
-rw-r--r-- | testsuites/fstests/fsdosfsname01/init.c | 45 |
2 files changed, 46 insertions, 2 deletions
diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c index ae06ad3c56..8953b0b5f4 100644 --- a/cpukit/libfs/src/dosfs/msdos_misc.c +++ b/cpukit/libfs/src/dosfs/msdos_misc.c @@ -1585,7 +1585,8 @@ msdos_find_file_in_directory ( printf ("MSFS:[9.2] checksum, entry_matched:%i, lfn_entry:%i, lfn_checksum:%02x/%02x\n", entry_matched, lfn_entry, lfn_checksum, msdos_lfn_checksum(entry)); #endif - } else { + } else if ((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_VOLUME_ID) + == 0) { bytes_in_entry = MSDOS_SHORT_NAME_LEN + 1; bytes_in_entry = msdos_short_entry_to_utf8_name ( converter, diff --git a/testsuites/fstests/fsdosfsname01/init.c b/testsuites/fstests/fsdosfsname01/init.c index 6ecb7f24dc..93f24a4e2c 100644 --- a/testsuites/fstests/fsdosfsname01/init.c +++ b/testsuites/fstests/fsdosfsname01/init.c @@ -46,6 +46,7 @@ const char rtems_test_name[] = "FSDOSFSNAME 1"; #define RAMDISK_PATH "/dev/rda" #define BLOCK_NUM 47 #define BLOCK_SIZE 512 +#define VOLUME_LABEL "MyDisk" #define NUMBER_OF_DIRECTORIES 8 #define NUMBER_OF_FILES 13 @@ -78,7 +79,7 @@ static rtems_resource_snapshot before_mount; static const msdos_format_request_param_t rqdata = { .OEMName = "RTEMS", - .VolLabel = "RTEMSDisk", + .VolLabel = VOLUME_LABEL, .sectors_per_cluster = 2, .fat_num = 0, .files_per_root_dir = 0, @@ -1107,10 +1108,52 @@ static void test_full_8_3_name( void ) rtems_test_assert( rc == 0 ); } +static void test_dir_with_same_name_as_volume_label( void ) +{ + int rc; + DIR *dirp; + + rc = mkdir( MOUNT_DIR "/" VOLUME_LABEL, S_IRWXU | S_IRWXG | S_IRWXO ); + rtems_test_assert( rc == 0 ); + + dirp = opendir( MOUNT_DIR "/" VOLUME_LABEL ); + rtems_test_assert( NULL != dirp ); + + rc = closedir( dirp ); + rtems_test_assert( rc == 0 ); + + rc = unlink( MOUNT_DIR "/" VOLUME_LABEL ); + rtems_test_assert( rc == 0 ); +} + +static void test_file_with_same_name_as_volume_label( void ) +{ + int rc; + int fd; + + fd = open( MOUNT_DIR "/" VOLUME_LABEL, O_RDWR | O_CREAT, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH ); + rtems_test_assert( fd >= 0 ); + + rc = close( fd ); + rtems_test_assert( rc == 0 ); + + fd = open( MOUNT_DIR "/" VOLUME_LABEL, O_RDWR ); + rtems_test_assert( fd >= 0 ); + + rc = close( fd ); + rtems_test_assert( rc == 0 ); + + rc = unlink( MOUNT_DIR "/" VOLUME_LABEL ); + rtems_test_assert( rc == 0 ); +} + static void test_special_cases( void ) { test_end_of_string_matches(); test_full_8_3_name(); + test_file_with_same_name_as_volume_label(); + test_dir_with_same_name_as_volume_label(); } /* |