[rtems commit] dosfs: Fix msdos_utf8_normalize_and_fold()

Sebastian Huber sebh at rtems.org
Tue Mar 21 15:16:33 UTC 2017


Module:    rtems
Branch:    4.11
Commit:    21d7154b07a873476a9ad5899e1db9729d4eb410
Changeset: http://git.rtems.org/rtems/commit/?id=21d7154b07a873476a9ad5899e1db9729d4eb410

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Mar 14 13:59:09 2017 +0100

dosfs: Fix msdos_utf8_normalize_and_fold()

It is all right in case the result uses the full destination buffer.
Without this fix the handling of a maximum 8.3 short file name is
broken.

Close #2928.

---

 cpukit/libfs/src/dosfs/msdos_conv_utf8.c |  4 ++--
 testsuites/fstests/fsdosfsname01/init.c  | 23 ++++++++++++++++++++---
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/cpukit/libfs/src/dosfs/msdos_conv_utf8.c b/cpukit/libfs/src/dosfs/msdos_conv_utf8.c
index ddf2fdb..cc5c027 100644
--- a/cpukit/libfs/src/dosfs/msdos_conv_utf8.c
+++ b/cpukit/libfs/src/dosfs/msdos_conv_utf8.c
@@ -222,10 +222,10 @@ static int msdos_utf8_normalize_and_fold(
   );
 
   if ( result >= 0 ) {
-    if ( result < unicode_buf_size ) {
+    if ( result <= unicode_buf_size ) {
       unicodes_to_reencode = result;
     } else {
-      unicodes_to_reencode = unicode_buf_size - 1;
+      unicodes_to_reencode = unicode_buf_size;
       eno = ENOMEM;
     }
 
diff --git a/testsuites/fstests/fsdosfsname01/init.c b/testsuites/fstests/fsdosfsname01/init.c
index 4d06958..7d8dfc1 100644
--- a/testsuites/fstests/fsdosfsname01/init.c
+++ b/testsuites/fstests/fsdosfsname01/init.c
@@ -1087,6 +1087,23 @@ static void test_end_of_string_matches( void )
   rtems_test_assert( rc == 0 );
 }
 
+static void test_full_8_3_name( void )
+{
+  int rc;
+
+  rc = mkdir( MOUNT_DIR "/txtvsbin.txt", S_IRWXU | S_IRWXG | S_IRWXO );
+  rtems_test_assert( rc == 0 );
+
+  rc = unlink( MOUNT_DIR "/txtvsbin.txt" );
+  rtems_test_assert( rc == 0 );
+}
+
+static void test_special_cases( void )
+{
+  test_end_of_string_matches();
+  test_full_8_3_name();
+}
+
 /*
  * Main test method
  */
@@ -1145,7 +1162,7 @@ static void test( void )
     "/dev/rdb",
     NULL);
 
-  test_end_of_string_matches();
+  test_special_cases();
 
   rc = unmount( MOUNT_DIR );
   rtems_test_assert( rc == 0 );
@@ -1215,7 +1232,7 @@ static void test( void )
     "/dev/rdb",
     &mount_opts[1]);
 
-  test_end_of_string_matches();
+  test_special_cases();
 
   rc = unmount( MOUNT_DIR );
   rtems_test_assert( rc == 0 );
@@ -1280,7 +1297,7 @@ static void test( void )
     "/dev/rdc",
     &mount_opts[1]);
 
-  test_end_of_string_matches();
+  test_special_cases();
 
   rc = unmount( MOUNT_DIR );
   rtems_test_assert( rc == 0 );



More information about the vc mailing list