From 1becaa953e9728c792526983ee76be5ddd47c3fd Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 14 Mar 2017 13:59:09 +0100 Subject: 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. Update #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 ddf2fdbaa7..cc5c0271a7 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 4d0695872a..7d8dfc15b7 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 ); -- cgit v1.2.3