Guard the Requester so that the Responder can't do whatever it wants

This commit is contained in:
Olivier 'reivilibre' 2022-05-29 09:45:02 +01:00
parent e1c6d31ee3
commit 438af9164e
2 changed files with 15 additions and 5 deletions

View File

@ -11,6 +11,7 @@ use std::sync::Arc;
use yama::commands::{load_pile_descriptor, open_pile}; use yama::commands::{load_pile_descriptor, open_pile};
use yama::definitions::{PartialPointerData, TreeNode}; use yama::definitions::{PartialPointerData, TreeNode};
use yama::operations::storing::{pointer_ops_prepare_to_store, pointers_ops_after_store}; use yama::operations::storing::{pointer_ops_prepare_to_store, pointers_ops_after_store};
use yama::pile::access_guard::PileGuard;
use yama::pile::{Pile, RawPile, StoragePipelineSettings}; use yama::pile::{Pile, RawPile, StoragePipelineSettings};
use yama::progress::ProgressTracker; use yama::progress::ProgressTracker;
use yama::remote::responder::{Responder, ResponderWritingPipeline}; use yama::remote::responder::{Responder, ResponderWritingPipeline};
@ -94,11 +95,13 @@ pub fn chunking<
(None, None) (None, None)
}; };
let guarded_pile = PileGuard::new(Arc::clone(&raw_pile), true);
let (r_handle, w_handle, join_handles) = Responder::start( let (r_handle, w_handle, join_handles) = Responder::start(
read, read,
write, write,
get_number_of_workers("YAMA_RESPONDERS") as u16, get_number_of_workers("YAMA_RESPONDERS") as u16,
raw_pile, Arc::new(guarded_pile),
writing_pipeline, writing_pipeline,
progress_bar, progress_bar,
); );

View File

@ -17,8 +17,8 @@ use std::thread;
#[derivative(Clone(bound = ""))] #[derivative(Clone(bound = ""))]
// we need to use derivative's Clone impl because Arc<R> causes R to have a bound on Clone // we need to use derivative's Clone impl because Arc<R> causes R to have a bound on Clone
// even though that's not needed. https://github.com/rust-lang/rust/issues/26925 // even though that's not needed. https://github.com/rust-lang/rust/issues/26925
pub struct PileGuard<R: RawPile> { pub struct PileGuard<R: Clone + RawPile> {
underlying: Arc<R>, underlying: R,
/// Whether to verify chunk IDs to prevent malicious corruption /// Whether to verify chunk IDs to prevent malicious corruption
verify_chunk_ids: bool, verify_chunk_ids: bool,
} }
@ -39,9 +39,16 @@ fn pipeline(
Ok(()) Ok(())
} }
impl<R: RawPile> PileGuard<R> {} impl<R: Clone + RawPile> PileGuard<R> {
pub fn new(underlying: R, verify_chunk_ids: bool) -> Self {
PileGuard {
underlying,
verify_chunk_ids,
}
}
}
impl<R: RawPile> RawPile for PileGuard<R> { impl<R: Clone + RawPile> RawPile for PileGuard<R> {
fn exists(&self, kind: Keyspace, key: &[u8]) -> anyhow::Result<bool> { fn exists(&self, kind: Keyspace, key: &[u8]) -> anyhow::Result<bool> {
match kind { match kind {
Keyspace::Chunk => self.underlying.exists(kind, key), Keyspace::Chunk => self.underlying.exists(kind, key),