summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2017-12-06 15:56:50 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-12-07 08:04:11 +0100
commitd438427cbe6ca8138d0c64b58a32a2b0ab4a6fa8 (patch)
treef7c76f890afff4c51226ff1e9d0c3d69b33b8880
parent004a63efef768583d872f3d5d45d008c7b597dc6 (diff)
dosfs: Allow creating a file with similar name.
If there is already a file with a long file name it isn't possible to create a second file which has a name that ends on the first files name (for example ets.beam and sets.beam). This patch fixes that. Close #3258.
-rw-r--r--cpukit/libfs/src/dosfs/msdos_misc.c10
-rw-r--r--testsuites/fstests/fsdosfsname01/init.c25
2 files changed, 32 insertions, 3 deletions
diff --git a/cpukit/libfs/src/dosfs/msdos_misc.c b/cpukit/libfs/src/dosfs/msdos_misc.c
index 8953b0b5f4..7166485ed1 100644
--- a/cpukit/libfs/src/dosfs/msdos_misc.c
+++ b/cpukit/libfs/src/dosfs/msdos_misc.c
@@ -1564,9 +1564,13 @@ msdos_find_file_in_directory (
if (entry_matched)
{
if (lfn_entry ||
- lfn_checksum != msdos_lfn_checksum(entry))
- entry_matched = false;
- else if (name_len_remaining == 0) {
+ name_len_remaining > 0 ||
+ lfn_checksum != msdos_lfn_checksum(entry)) {
+ msdos_prepare_for_next_entry(&lfn_start,
+ &entry_matched,
+ &name_len_remaining,
+ name_len_for_compare);
+ } else if (name_len_remaining == 0) {
filename_matched = true;
rc = msdos_on_entry_found (
fs_info,
diff --git a/testsuites/fstests/fsdosfsname01/init.c b/testsuites/fstests/fsdosfsname01/init.c
index 93f24a4e2c..75c571c59f 100644
--- a/testsuites/fstests/fsdosfsname01/init.c
+++ b/testsuites/fstests/fsdosfsname01/init.c
@@ -1097,6 +1097,30 @@ static void test_end_of_string_matches( void )
rtems_test_assert( rc == 0 );
}
+static void test_end_of_string_matches_2( void )
+{
+ int rc;
+ int fd;
+
+ fd = open( MOUNT_DIR "/ets.beam", 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 "/sets.beam", 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 );
+
+ rc = unlink( MOUNT_DIR "/sets.beam" );
+ rtems_test_assert( rc == 0 );
+
+ rc = unlink( MOUNT_DIR "/ets.beam" );
+ rtems_test_assert( rc == 0 );
+}
+
static void test_full_8_3_name( void )
{
int rc;
@@ -1151,6 +1175,7 @@ static void test_file_with_same_name_as_volume_label( void )
static void test_special_cases( void )
{
test_end_of_string_matches();
+ test_end_of_string_matches_2();
test_full_8_3_name();
test_file_with_same_name_as_volume_label();
test_dir_with_same_name_as_volume_label();