Fix bad . .. name entries generation

This commit is contained in:
Fabrice Desclaux 2019-07-15 14:08:28 +02:00 committed by Rafał Harabień
parent 85a3aeb262
commit f13f720cda

View File

@ -18,6 +18,8 @@ type LfnUtf16 = Vec<u16>;
#[cfg(not(feature = "alloc"))] #[cfg(not(feature = "alloc"))]
type LfnUtf16 = (); type LfnUtf16 = ();
const SFN_PADDING: u8 = 0x20;
pub(crate) enum DirRawStream<'a, T: ReadWriteSeek + 'a> { pub(crate) enum DirRawStream<'a, T: ReadWriteSeek + 'a> {
File(File<'a, T>), File(File<'a, T>),
Root(DiskSlice<FsIoAdapter<'a, T>>), Root(DiskSlice<FsIoAdapter<'a, T>>),
@ -242,10 +244,10 @@ impl<'a, T: ReadWriteSeek + 'a> Dir<'a, T> {
let entry = self.write_entry(name, sfn_entry)?; let entry = self.write_entry(name, sfn_entry)?;
let dir = entry.to_dir(); let dir = entry.to_dir();
// create special entries "." and ".." // create special entries "." and ".."
let dot_sfn = ShortNameGenerator::new(".").generate().unwrap(); let dot_sfn = ShortNameGenerator::generate_dot();
let sfn_entry = self.create_sfn_entry(dot_sfn, FileAttributes::DIRECTORY, entry.first_cluster()); let sfn_entry = self.create_sfn_entry(dot_sfn, FileAttributes::DIRECTORY, entry.first_cluster());
dir.write_entry(".", sfn_entry)?; dir.write_entry(".", sfn_entry)?;
let dotdot_sfn = ShortNameGenerator::new("..").generate().unwrap(); let dotdot_sfn = ShortNameGenerator::generate_dotdot();
let sfn_entry = let sfn_entry =
self.create_sfn_entry(dotdot_sfn, FileAttributes::DIRECTORY, self.stream.first_cluster()); self.create_sfn_entry(dotdot_sfn, FileAttributes::DIRECTORY, self.stream.first_cluster());
dir.write_entry("..", sfn_entry)?; dir.write_entry("..", sfn_entry)?;
@ -815,7 +817,7 @@ struct ShortNameGenerator {
impl ShortNameGenerator { impl ShortNameGenerator {
fn new(name: &str) -> Self { fn new(name: &str) -> Self {
// padded by ' ' // padded by ' '
let mut short_name = [0x20u8; 11]; let mut short_name = [SFN_PADDING; 11];
// find extension after last dot // find extension after last dot
let (basename_len, name_fits, lossy_conv) = match name.rfind('.') { let (basename_len, name_fits, lossy_conv) = match name.rfind('.') {
Some(index) => { Some(index) => {
@ -836,6 +838,19 @@ impl ShortNameGenerator {
Self { short_name, chksum, name_fits, lossy_conv, basename_len: basename_len as u8, ..Default::default() } Self { short_name, chksum, name_fits, lossy_conv, basename_len: basename_len as u8, ..Default::default() }
} }
fn generate_dot() -> [u8; 11] {
let mut short_name = [SFN_PADDING; 11];
short_name[0] = 0x2e;
short_name
}
fn generate_dotdot() -> [u8; 11] {
let mut short_name = [SFN_PADDING; 11];
short_name[0] = 0x2e;
short_name[1] = 0x2e;
short_name
}
fn copy_short_name_part(dst: &mut [u8], src: &str) -> (usize, bool, bool) { fn copy_short_name_part(dst: &mut [u8], src: &str) -> (usize, bool, bool) {
let mut dst_pos = 0; let mut dst_pos = 0;
let mut lossy_conv = false; let mut lossy_conv = false;
@ -939,7 +954,7 @@ impl ShortNameGenerator {
} }
fn build_prefixed_name(&self, num: u32, with_chksum: bool) -> [u8; 11] { fn build_prefixed_name(&self, num: u32, with_chksum: bool) -> [u8; 11] {
let mut buf = [0x20u8; 11]; let mut buf = [SFN_PADDING; 11];
let prefix_len = if with_chksum { let prefix_len = if with_chksum {
let prefix_len = cmp::min(self.basename_len as usize, 2); let prefix_len = cmp::min(self.basename_len as usize, 2);
buf[..prefix_len].copy_from_slice(&self.short_name[..prefix_len]); buf[..prefix_len].copy_from_slice(&self.short_name[..prefix_len]);