Skip to content
...@@ -22,6 +22,9 @@ pub enum CvfsErrors { ...@@ -22,6 +22,9 @@ pub enum CvfsErrors {
RmpEncode(String), RmpEncode(String),
/// A deserialisation error occured /// A deserialisation error occured
RmpDecode(String), RmpDecode(String),
/// CryptoVfsInner was dropped before SecureFileHandler
CVFSAlreadyDropped(&'static str),
} }
pub fn specify_io_error<O>(r: Result<O, std::io::Error>, reason: &'static str) -> CvfsResult<O> { pub fn specify_io_error<O>(r: Result<O, std::io::Error>, reason: &'static str) -> CvfsResult<O> {
......
...@@ -118,7 +118,7 @@ pub struct CryptoVfsInner { ...@@ -118,7 +118,7 @@ pub struct CryptoVfsInner {
//this: Weak<Mutex<CryptoVfsInner>>, //this: Weak<Mutex<CryptoVfsInner>>,
keys: LiveKeys, keys: LiveKeys,
metadata: Metadata, metadata: Metadata,
file_tag_counter: usize, //AtomicUsize, file_tag_counter: u64, //AtomicUsize,
real_base_path: PathBuf, real_base_path: PathBuf,
} }
impl CryptoVfsInner { impl CryptoVfsInner {
......
...@@ -131,9 +131,9 @@ impl core::fmt::Debug for FileInfo { ...@@ -131,9 +131,9 @@ impl core::fmt::Debug for FileInfo {
} }
#[derive(Clone, PartialEq, Eq, Debug)] #[derive(Clone, PartialEq, Eq, Debug)]
pub struct FileTag(pub(crate) usize); pub struct FileTag(pub(crate) u64);
impl FileTag { impl FileTag {
pub fn next(file_tag_counter: &mut usize) -> Self { pub fn next(file_tag_counter: &mut u64) -> Self {
//FileTag(file_tag_counter.fetch_add(1, Ordering::SeqCst)) //FileTag(file_tag_counter.fetch_add(1, Ordering::SeqCst))
let id = file_tag_counter.clone(); let id = file_tag_counter.clone();
*file_tag_counter += 1; *file_tag_counter += 1;
......
...@@ -184,30 +184,27 @@ pub struct SecureFileHandler { ...@@ -184,30 +184,27 @@ pub struct SecureFileHandler {
} }
impl SecureFileHandler { impl SecureFileHandler {
pub fn try_write(&mut self, buffer: &[u8]) -> CvfsResult<usize> { pub fn try_write(&mut self, buffer: &[u8]) -> CvfsResult<usize> {
let arc = self let arc = self.cvfs.upgrade().ok_or(CvfsErrors::CVFSAlreadyDropped(
.cvfs "try_write(): CryptoVfsInner was dropped before SecureFileHandler",
.upgrade() ))?;
.expect("CryptoVfsInner was dropped before SecureFileHandler");
let mut cvfs = arc.lock().expect("Metadata Mutex poisened"); let mut cvfs = arc.lock().expect("Metadata Mutex poisened");
let file = cvfs.metadata.find_active_file(&self.id)?; let file = cvfs.metadata.find_active_file(&self.id)?;
Ok(file.write(buffer)?) Ok(file.write(buffer)?)
} }
pub fn try_read(&mut self, out_buffer: &mut [u8]) -> CvfsResult<usize> { pub fn try_read(&mut self, out_buffer: &mut [u8]) -> CvfsResult<usize> {
let arc = self let arc = self.cvfs.upgrade().ok_or(CvfsErrors::CVFSAlreadyDropped(
.cvfs "try_read(): Metadata was dropped before SecureFileHandler",
.upgrade() ))?;
.expect("Metadata was dropped before SecureFileHandler");
let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened"); let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened");
let file = cvfs.metadata.find_active_file(&self.id)?; let file = cvfs.metadata.find_active_file(&self.id)?;
Ok(file.read(out_buffer)?) Ok(file.read(out_buffer)?)
} }
pub fn try_flush(&mut self) -> CvfsResult<()> { pub fn try_flush(&mut self) -> CvfsResult<()> {
let arc = self let arc = self.cvfs.upgrade().ok_or(CvfsErrors::CVFSAlreadyDropped(
.cvfs "try_flush(): Metadata was dropped before SecureFileHandler",
.upgrade() ))?;
.expect("Metadata was dropped before SecureFileHandler");
let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened"); let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened");
// splitting the CryptoVfsInner struct instead of the MutexGuard // splitting the CryptoVfsInner struct instead of the MutexGuard
let cvfs: &mut CryptoVfsInner = &mut cvfs; let cvfs: &mut CryptoVfsInner = &mut cvfs;
...@@ -222,10 +219,9 @@ impl SecureFileHandler { ...@@ -222,10 +219,9 @@ impl SecureFileHandler {
/// ///
/// The cursor is not changed and may be hanging over the end, use the `Seek` methods like `Seek.rewind()` for that. /// The cursor is not changed and may be hanging over the end, use the `Seek` methods like `Seek.rewind()` for that.
pub fn set_len(&mut self, size: usize) -> CvfsResult<()> { pub fn set_len(&mut self, size: usize) -> CvfsResult<()> {
let arc = self let arc = self.cvfs.upgrade().ok_or(CvfsErrors::CVFSAlreadyDropped(
.cvfs "set_len(): Metadata was dropped before SecureFileHandler",
.upgrade() ))?;
.expect("Metadata was dropped before SecureFileHandler");
let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened"); let mut cvfs = arc.lock().expect("CryptoVfsInner Mutex poisened");
let file = cvfs.metadata.find_active_file(&self.id)?; let file = cvfs.metadata.find_active_file(&self.id)?;
...@@ -250,13 +246,8 @@ impl Read for SecureFileHandler { ...@@ -250,13 +246,8 @@ impl Read for SecureFileHandler {
} }
impl Drop for SecureFileHandler { impl Drop for SecureFileHandler {
fn drop(&mut self) { fn drop(&mut self) {
if let Err(error) = self.try_flush() { // ignore errors since we can not do much at this point
if panicking() { let _ = self.try_flush();
eprintln!("SecureFileHandler::drop() -> {error:?}");
} else {
panic!("SecureFileHandler::drop() -> {error:?}");
}
}
} }
} }
......
...@@ -492,7 +492,7 @@ fn argon2_key_stream( ...@@ -492,7 +492,7 @@ fn argon2_key_stream(
params.output_len((256 + 128 + 128) / 8)?; params.output_len((256 + 128 + 128) / 8)?;
let argon2 = Argon2::from(params.params()?); let argon2 = Argon2::from(params.params()?);
let key_stream = argon2.hash_password(password, &salt)?; let key_stream = argon2.hash_password(password, salt)?;
let output = key_stream.hash.expect("unable to produce key stream"); let output = key_stream.hash.expect("unable to produce key stream");
assert!( assert!(
64 <= output.len(), 64 <= output.len(),
......