summaryrefslogtreecommitdiffstats
path: root/vendor/object/src/read/macho
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:42 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:42 +0000
commit837b550238aa671a591ccf282dddeab29cadb206 (patch)
tree914b6b8862bace72bd3245ca184d374b08d8a672 /vendor/object/src/read/macho
parentAdding debian version 1.70.0+dfsg2-1. (diff)
downloadrustc-837b550238aa671a591ccf282dddeab29cadb206.tar.xz
rustc-837b550238aa671a591ccf282dddeab29cadb206.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/object/src/read/macho')
-rw-r--r--vendor/object/src/read/macho/dyld_cache.rs2
-rw-r--r--vendor/object/src/read/macho/file.rs2
-rw-r--r--vendor/object/src/read/macho/load_command.rs22
-rw-r--r--vendor/object/src/read/macho/relocation.rs17
-rw-r--r--vendor/object/src/read/macho/section.rs9
-rw-r--r--vendor/object/src/read/macho/segment.rs8
-rw-r--r--vendor/object/src/read/macho/symbol.rs2
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 }
}