summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-03-14 13:59:09 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-03-21 16:14:37 +0100
commit21d7154b07a873476a9ad5899e1db9729d4eb410 (patch)
treec456bf42f26f023003cf722ea7e5b8b559a57c5e
parentf08c71339c05cb462a32a11e3150d71603340e94 (diff)
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.
-rw-r--r--cpukit/libfs/src/dosfs/msdos_conv_utf8.c4
-rw-r--r--testsuites/fstests/fsdosfsname01/init.c23
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 );