From 5740ae51d6f031a538cf447d19e1db73c5964769 Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Wed, 5 Jul 2023 10:02:18 +0000 Subject: [PATCH] efi/file: fixup dir/file name Fat filename can be 12, that is filename with length of 8 and extension name with length of 3 and a separator like '.'. But directory name length limits to 11. That's say some name can't be shown correctly. For that case, we can do a fixup to give a correct name to userspace. Fixes: #261 Signed-off-by: Jianyong Wu --- src/fat.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/fat.rs b/src/fat.rs index 93d003d7..4799db58 100644 --- a/src/fat.rs +++ b/src/fat.rs @@ -232,6 +232,17 @@ fn name_to_str(input: &str, output: &mut [u8]) { break; } } + + // Fixup for Director or file name, when the length of its name and extend name equals 11. There maybe no + // separation between them. If so, add it. + if output[10] >= b'a' && output[10] <= b'z' + || output[10] >= b'A' && output[10] <= b'Z' && output[7] != b' ' && output[7] != b'.' + { + output[11] = output[10]; + output[10] = output[9]; + output[9] = output[8]; + output[8] = b'.'; + } } impl<'a> Read for Node<'a> { @@ -282,7 +293,9 @@ impl<'a> Directory<'a> { match self.filesystem.read(u64::from(sector), data) { Ok(_) => {} - Err(e) => return Err(Error::Block(e)), + Err(e) => { + return Err(Error::Block(e)); + } }; Ok(()) @@ -403,9 +416,9 @@ impl<'a> Directory<'a> { } } - pub fn next_node(&mut self) -> Result<(Node, [u8; 11]), Error> { + pub fn next_node(&mut self) -> Result<(Node, [u8; 12]), Error> { let de = self.next_entry()?; - let mut name = [0_u8; 11]; + let mut name = [0_u8; 12]; name_to_str(core::str::from_utf8(&de.name).unwrap(), &mut name); match de.file_type { @@ -1172,16 +1185,16 @@ mod tests { #[test] fn test_name_to_str() { - let mut s = [0_u8; 11]; + let mut s = [0_u8; 12]; super::name_to_str("X ABC", &mut s); assert_eq!(crate::common::ascii_strip(&s), "X.ABC"); - let mut s = [0_u8; 11]; + let mut s = [0_u8; 12]; super::name_to_str(".", &mut s); assert_eq!(crate::common::ascii_strip(&s), "."); - let mut s = [0_u8; 11]; + let mut s = [0_u8; 12]; super::name_to_str("..", &mut s); assert_eq!(crate::common::ascii_strip(&s), ".."); - let mut s = [0_u8; 11]; + let mut s = [0_u8; 12]; super::name_to_str("ABCDEFGHIJK", &mut s); assert_eq!(crate::common::ascii_strip(&s), "ABCDEFGHIJK"); }