From 00de99744524183d0fa0a2ada4c66a79eb331e77 Mon Sep 17 00:00:00 2001 From: Hiroki Tokunaga Date: Mon, 21 Jun 2021 11:45:34 +0900 Subject: [PATCH 1/3] refactor: split `ElfBinary::load` This function adds `ElfBinary::iter_loadable_headers`. --- src/lib.rs | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4b7bdc2..538f782 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -438,27 +438,7 @@ impl<'s> ElfBinary<'s> { pub fn load(&self, loader: &mut dyn ElfLoader) -> Result<(), ElfLoaderErr> { self.is_loadable()?; - // Trying to determine loadeable headers - fn select_load(&pheader: &ProgramHeader) -> bool { - if let Ph64(header) = pheader { - header - .get_type() - .map(|typ| typ == Type::Load) - .unwrap_or(false) - } else { - false - } - } - - // Create an iterator (well filter really) that has all loadeable - // headers and pass it to the loader - // TODO: This is pretty ugly, maybe we can do something with impl Trait? - // https://stackoverflow.com/questions/27535289/what-is-the-correct-way-to-return-an-iterator-or-any-other-trait - let load_iter = self - .file - .program_iter() - .filter(select_load as fn(&ProgramHeader) -> bool); - loader.allocate(load_iter)?; + loader.allocate(self.iter_loadable_headers())?; // Load all headers for p in self.file.program_iter() { @@ -496,6 +476,28 @@ impl<'s> ElfBinary<'s> { Ok(()) } + + fn iter_loadable_headers(&self) -> LoadableHeaders { + // Trying to determine loadeable headers + fn select_load(&pheader: &ProgramHeader) -> bool { + if let Ph64(header) = pheader { + header + .get_type() + .map(|typ| typ == Type::Load) + .unwrap_or(false) + } else { + false + } + } + + // Create an iterator (well filter really) that has all loadeable + // headers and pass it to the loader + // TODO: This is pretty ugly, maybe we can do something with impl Trait? + // https://stackoverflow.com/questions/27535289/what-is-the-correct-way-to-return-an-iterator-or-any-other-trait + self.file + .program_iter() + .filter(select_load as fn(&ProgramHeader) -> bool) + } } #[cfg(test)] From 8f716d0b460995db02d6296aba541ca8b61241df Mon Sep 17 00:00:00 2001 From: Hiroki Tokunaga Date: Mon, 21 Jun 2021 11:46:41 +0900 Subject: [PATCH 2/3] refactor: remove an unnecessary `&` --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 538f782..3d402e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -479,7 +479,7 @@ impl<'s> ElfBinary<'s> { fn iter_loadable_headers(&self) -> LoadableHeaders { // Trying to determine loadeable headers - fn select_load(&pheader: &ProgramHeader) -> bool { + fn select_load(pheader: &ProgramHeader) -> bool { if let Ph64(header) = pheader { header .get_type() From 21095001bb8e017df4a02f469f7340e7ca8f3e7d Mon Sep 17 00:00:00 2001 From: Hiroki Tokunaga Date: Mon, 21 Jun 2021 11:47:09 +0900 Subject: [PATCH 3/3] refactor: remove an unnecessary cast --- src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3d402e9..36ee3a2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -494,9 +494,7 @@ impl<'s> ElfBinary<'s> { // headers and pass it to the loader // TODO: This is pretty ugly, maybe we can do something with impl Trait? // https://stackoverflow.com/questions/27535289/what-is-the-correct-way-to-return-an-iterator-or-any-other-trait - self.file - .program_iter() - .filter(select_load as fn(&ProgramHeader) -> bool) + self.file.program_iter().filter(select_load) } }