diff options
Diffstat (limited to 'vendor/object/src/read/macho')
-rw-r--r-- | vendor/object/src/read/macho/dyld_cache.rs | 2 | ||||
-rw-r--r-- | vendor/object/src/read/macho/file.rs | 2 | ||||
-rw-r--r-- | vendor/object/src/read/macho/load_command.rs | 22 | ||||
-rw-r--r-- | vendor/object/src/read/macho/relocation.rs | 17 | ||||
-rw-r--r-- | vendor/object/src/read/macho/section.rs | 9 | ||||
-rw-r--r-- | vendor/object/src/read/macho/segment.rs | 8 | ||||
-rw-r--r-- | vendor/object/src/read/macho/symbol.rs | 2 |
7 files changed, 42 insertions, 20 deletions
diff --git a/vendor/object/src/read/macho/dyld_cache.rs b/vendor/object/src/read/macho/dyld_cache.rs index 0839ded7d..68f27f549 100644 --- a/vendor/object/src/read/macho/dyld_cache.rs +++ b/vendor/object/src/read/macho/dyld_cache.rs @@ -191,7 +191,7 @@ where /// The file system path of this image. pub fn path(&self) -> Result<&'data str> { let path = self.image_info.path(self.cache.endian, self.cache.data)?; - // The path should always be ascii, so from_utf8 should alway succeed. + // The path should always be ascii, so from_utf8 should always succeed. let path = core::str::from_utf8(path).map_err(|_| Error("Path string not valid utf-8"))?; Ok(path) } diff --git a/vendor/object/src/read/macho/file.rs b/vendor/object/src/read/macho/file.rs index ab8c05757..368c28bbd 100644 --- a/vendor/object/src/read/macho/file.rs +++ b/vendor/object/src/read/macho/file.rs @@ -192,6 +192,7 @@ where match self.header.cputype(self.endian) { macho::CPU_TYPE_ARM => Architecture::Arm, macho::CPU_TYPE_ARM64 => Architecture::Aarch64, + macho::CPU_TYPE_ARM64_32 => Architecture::Aarch64_Ilp32, macho::CPU_TYPE_X86 => Architecture::I386, macho::CPU_TYPE_X86_64 => Architecture::X86_64, macho::CPU_TYPE_MIPS => Architecture::Mips, @@ -531,7 +532,6 @@ pub type MachOComdatSectionIterator64<'data, 'file, Endian = Endianness, R = &'d #[derive(Debug)] pub struct MachOComdatSectionIterator<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { diff --git a/vendor/object/src/read/macho/load_command.rs b/vendor/object/src/read/macho/load_command.rs index 10daf4ed1..e9af89d8b 100644 --- a/vendor/object/src/read/macho/load_command.rs +++ b/vendor/object/src/read/macho/load_command.rs @@ -1,10 +1,11 @@ use core::marker::PhantomData; +use core::mem; use crate::endian::Endian; use crate::macho; use crate::pod::Pod; use crate::read::macho::{MachHeader, SymbolTable}; -use crate::read::{Bytes, ReadError, ReadRef, Result, StringTable}; +use crate::read::{Bytes, Error, ReadError, ReadRef, Result, StringTable}; /// An iterator over the load commands of a `MachHeader`. #[derive(Debug, Default, Clone, Copy)] @@ -34,6 +35,9 @@ impl<'data, E: Endian> LoadCommandIterator<'data, E> { .read_error("Invalid Mach-O load command header")?; let cmd = header.cmd.get(self.endian); let cmdsize = header.cmdsize.get(self.endian) as usize; + if cmdsize < mem::size_of::<macho::LoadCommand<E>>() { + return Err(Error("Invalid Mach-O load command size")); + } let data = self .data .read_bytes(cmdsize) @@ -351,3 +355,19 @@ impl<E: Endian> macho::SymtabCommand<E> { Ok(SymbolTable::new(symbols, strings)) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::LittleEndian; + + #[test] + fn cmd_size_invalid() { + let mut commands = LoadCommandIterator::new(LittleEndian, &[0; 8], 10); + assert!(commands.next().is_err()); + let mut commands = LoadCommandIterator::new(LittleEndian, &[0, 0, 0, 0, 7, 0, 0, 0, 0], 10); + assert!(commands.next().is_err()); + let mut commands = LoadCommandIterator::new(LittleEndian, &[0, 0, 0, 0, 8, 0, 0, 0, 0], 10); + assert!(commands.next().is_ok()); + } +} diff --git a/vendor/object/src/read/macho/relocation.rs b/vendor/object/src/read/macho/relocation.rs index 5dd7df896..18e22ef70 100644 --- a/vendor/object/src/read/macho/relocation.rs +++ b/vendor/object/src/read/macho/relocation.rs @@ -19,7 +19,6 @@ pub type MachORelocationIterator64<'data, 'file, Endian = Endianness, R = &'data /// An iterator over the relocations in a `MachOSection`. pub struct MachORelocationIterator<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { @@ -54,13 +53,15 @@ where relative: reloc.r_pcrel, }, }, - macho::CPU_TYPE_ARM64 => match (reloc.r_type, reloc.r_pcrel) { - (macho::ARM64_RELOC_UNSIGNED, false) => RelocationKind::Absolute, - _ => RelocationKind::MachO { - value: reloc.r_type, - relative: reloc.r_pcrel, - }, - }, + macho::CPU_TYPE_ARM64 | macho::CPU_TYPE_ARM64_32 => { + match (reloc.r_type, reloc.r_pcrel) { + (macho::ARM64_RELOC_UNSIGNED, false) => RelocationKind::Absolute, + _ => RelocationKind::MachO { + value: reloc.r_type, + relative: reloc.r_pcrel, + }, + } + } macho::CPU_TYPE_X86 => match (reloc.r_type, reloc.r_pcrel) { (macho::GENERIC_RELOC_VANILLA, false) => RelocationKind::Absolute, _ => RelocationKind::MachO { diff --git a/vendor/object/src/read/macho/section.rs b/vendor/object/src/read/macho/section.rs index 9e71aa8fd..f43a5b83d 100644 --- a/vendor/object/src/read/macho/section.rs +++ b/vendor/object/src/read/macho/section.rs @@ -21,7 +21,6 @@ pub type MachOSectionIterator64<'data, 'file, Endian = Endianness, R = &'data [u /// An iterator over the sections of a `MachOFile`. pub struct MachOSectionIterator<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { @@ -66,7 +65,6 @@ pub type MachOSection64<'data, 'file, Endian = Endianness, R = &'data [u8]> = #[derive(Debug)] pub struct MachOSection<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { @@ -120,7 +118,12 @@ where #[inline] fn align(&self) -> u64 { - 1 << self.internal.section.align(self.file.endian) + let align = self.internal.section.align(self.file.endian); + if align < 64 { + 1 << align + } else { + 0 + } } #[inline] diff --git a/vendor/object/src/read/macho/segment.rs b/vendor/object/src/read/macho/segment.rs index c7eaa6fff..01037e1dd 100644 --- a/vendor/object/src/read/macho/segment.rs +++ b/vendor/object/src/read/macho/segment.rs @@ -19,7 +19,6 @@ pub type MachOSegmentIterator64<'data, 'file, Endian = Endianness, R = &'data [u #[derive(Debug)] pub struct MachOSegmentIterator<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { @@ -53,7 +52,6 @@ pub type MachOSegment64<'data, 'file, Endian = Endianness, R = &'data [u8]> = #[derive(Debug)] pub struct MachOSegment<'data, 'file, Mach, R = &'data [u8]> where - 'data: 'file, Mach: MachHeader, R: ReadRef<'data>, { @@ -160,7 +158,7 @@ pub trait Segment: Debug + Pod { type Endian: endian::Endian; type Section: Section<Endian = Self::Endian>; - fn from_command(command: LoadCommandData<Self::Endian>) -> Result<Option<(&Self, &[u8])>>; + fn from_command(command: LoadCommandData<'_, Self::Endian>) -> Result<Option<(&Self, &[u8])>>; fn cmd(&self, endian: Self::Endian) -> u32; fn cmdsize(&self, endian: Self::Endian) -> u32; @@ -219,7 +217,7 @@ impl<Endian: endian::Endian> Segment for macho::SegmentCommand32<Endian> { type Endian = Endian; type Section = macho::Section32<Self::Endian>; - fn from_command(command: LoadCommandData<Self::Endian>) -> Result<Option<(&Self, &[u8])>> { + fn from_command(command: LoadCommandData<'_, Self::Endian>) -> Result<Option<(&Self, &[u8])>> { command.segment_32() } @@ -263,7 +261,7 @@ impl<Endian: endian::Endian> Segment for macho::SegmentCommand64<Endian> { type Endian = Endian; type Section = macho::Section64<Self::Endian>; - fn from_command(command: LoadCommandData<Self::Endian>) -> Result<Option<(&Self, &[u8])>> { + fn from_command(command: LoadCommandData<'_, Self::Endian>) -> Result<Option<(&Self, &[u8])>> { command.segment_64() } diff --git a/vendor/object/src/read/macho/symbol.rs b/vendor/object/src/read/macho/symbol.rs index e102c5d0b..ef8852145 100644 --- a/vendor/object/src/read/macho/symbol.rs +++ b/vendor/object/src/read/macho/symbol.rs @@ -388,7 +388,7 @@ where } #[inline] - fn flags(&self) -> SymbolFlags<SectionIndex> { + fn flags(&self) -> SymbolFlags<SectionIndex, SymbolIndex> { let n_desc = self.nlist.n_desc(self.file.endian); SymbolFlags::MachO { n_desc } } |