Skip to content

Commit 94d121a

Browse files
committed
Merge branch 'release/v0.1.4'
2 parents 47c7e2a + 8b115df commit 94d121a

File tree

3 files changed

+134
-130
lines changed

3 files changed

+134
-130
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mach_object"
3-
version = "0.1.3"
3+
version = "0.1.4"
44
authors = ["Flier Lu <[email protected]>"]
55
description = "Mach-O File Format Parser for Rust"
66
documentation = "http://flier.github.io/rust-macho/"

src/commands.rs

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ pub trait ReadStringExt: Read {
698698
impl<R: Read + ?Sized> ReadStringExt for R {}
699699

700700
impl LoadCommand {
701-
pub fn parse<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<(LoadCommand, usize)> {
701+
pub fn parse<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<(LoadCommand, usize)> {
702702
let begin = buf.position();
703703
let cmd = try!(buf.read_u32::<O>());
704704
let cmdsize = try!(buf.read_u32::<O>());
@@ -717,7 +717,7 @@ impl LoadCommand {
717717
let mut sections = Vec::new();
718718

719719
for _ in 0..nsects {
720-
sections.push(Rc::new(try!(Section::parse_section::<Cursor<&[u8]>, O>(buf))));
720+
sections.push(Rc::new(try!(Section::parse_section::<Cursor<T>, O>(buf))));
721721
}
722722

723723
LoadCommand::Segment {
@@ -745,7 +745,7 @@ impl LoadCommand {
745745
let mut sections = Vec::new();
746746

747747
for _ in 0..nsects {
748-
sections.push(Rc::new(try!(Section::parse_section64::<Cursor<&[u8]>, O>(buf))));
748+
sections.push(Rc::new(try!(Section::parse_section64::<Cursor<T>, O>(buf))));
749749
}
750750

751751
LoadCommand::Segment64 {
@@ -760,19 +760,19 @@ impl LoadCommand {
760760
sections: sections,
761761
}
762762
}
763-
LC_IDFVMLIB => LoadCommand::IdFvmLib(try!(Self::read_fvmlib::<O>(buf))),
764-
LC_LOADFVMLIB => LoadCommand::LoadFvmLib(try!(Self::read_fvmlib::<O>(buf))),
763+
LC_IDFVMLIB => LoadCommand::IdFvmLib(try!(Self::read_fvmlib::<O, T>(buf))),
764+
LC_LOADFVMLIB => LoadCommand::LoadFvmLib(try!(Self::read_fvmlib::<O, T>(buf))),
765765

766-
LC_ID_DYLIB => LoadCommand::IdDyLib(try!(Self::read_dylib::<O>(buf))),
767-
LC_LOAD_DYLIB => LoadCommand::LoadDyLib(try!(Self::read_dylib::<O>(buf))),
768-
LC_LOAD_WEAK_DYLIB => LoadCommand::LoadWeakDyLib(try!(Self::read_dylib::<O>(buf))),
769-
LC_REEXPORT_DYLIB => LoadCommand::ReexportDyLib(try!(Self::read_dylib::<O>(buf))),
770-
LC_LOAD_UPWARD_DYLIB => LoadCommand::LoadUpwardDylib(try!(Self::read_dylib::<O>(buf))),
771-
LC_LAZY_LOAD_DYLIB => LoadCommand::LazyLoadDylib(try!(Self::read_dylib::<O>(buf))),
766+
LC_ID_DYLIB => LoadCommand::IdDyLib(try!(Self::read_dylib::<O, T>(buf))),
767+
LC_LOAD_DYLIB => LoadCommand::LoadDyLib(try!(Self::read_dylib::<O, T>(buf))),
768+
LC_LOAD_WEAK_DYLIB => LoadCommand::LoadWeakDyLib(try!(Self::read_dylib::<O, T>(buf))),
769+
LC_REEXPORT_DYLIB => LoadCommand::ReexportDyLib(try!(Self::read_dylib::<O, T>(buf))),
770+
LC_LOAD_UPWARD_DYLIB => LoadCommand::LoadUpwardDylib(try!(Self::read_dylib::<O, T>(buf))),
771+
LC_LAZY_LOAD_DYLIB => LoadCommand::LazyLoadDylib(try!(Self::read_dylib::<O, T>(buf))),
772772

773-
LC_ID_DYLINKER => LoadCommand::IdDyLinker(try!(Self::read_dylinker::<O>(buf))),
774-
LC_LOAD_DYLINKER => LoadCommand::LoadDyLinker(try!(Self::read_dylinker::<O>(buf))),
775-
LC_DYLD_ENVIRONMENT => LoadCommand::DyLdEnv(try!(Self::read_dylinker::<O>(buf))),
773+
LC_ID_DYLINKER => LoadCommand::IdDyLinker(try!(Self::read_dylinker::<O, T>(buf))),
774+
LC_LOAD_DYLINKER => LoadCommand::LoadDyLinker(try!(Self::read_dylinker::<O, T>(buf))),
775+
LC_DYLD_ENVIRONMENT => LoadCommand::DyLdEnv(try!(Self::read_dylinker::<O, T>(buf))),
776776

777777
LC_SYMTAB => {
778778
LoadCommand::SymTab {
@@ -811,21 +811,13 @@ impl LoadCommand {
811811

812812
LoadCommand::Uuid(try!(Uuid::from_bytes(&uuid[..])))
813813
}
814-
LC_CODE_SIGNATURE => {
815-
LoadCommand::CodeSignature(try!(Self::read_linkedit_data::<O>(buf)))
816-
}
817-
LC_SEGMENT_SPLIT_INFO => {
818-
LoadCommand::SegmentSplitInfo(try!(Self::read_linkedit_data::<O>(buf)))
819-
}
820-
LC_FUNCTION_STARTS => {
821-
LoadCommand::FunctionStarts(try!(Self::read_linkedit_data::<O>(buf)))
822-
}
823-
LC_DATA_IN_CODE => LoadCommand::DataInCode(try!(Self::read_linkedit_data::<O>(buf))),
824-
LC_DYLIB_CODE_SIGN_DRS => {
825-
LoadCommand::DylibCodeSignDrs(try!(Self::read_linkedit_data::<O>(buf)))
826-
}
814+
LC_CODE_SIGNATURE => LoadCommand::CodeSignature(try!(Self::read_linkedit_data::<O, T>(buf))),
815+
LC_SEGMENT_SPLIT_INFO => LoadCommand::SegmentSplitInfo(try!(Self::read_linkedit_data::<O, T>(buf))),
816+
LC_FUNCTION_STARTS => LoadCommand::FunctionStarts(try!(Self::read_linkedit_data::<O, T>(buf))),
817+
LC_DATA_IN_CODE => LoadCommand::DataInCode(try!(Self::read_linkedit_data::<O, T>(buf))),
818+
LC_DYLIB_CODE_SIGN_DRS => LoadCommand::DylibCodeSignDrs(try!(Self::read_linkedit_data::<O, T>(buf))),
827819
LC_LINKER_OPTIMIZATION_HINT => {
828-
LoadCommand::LinkerOptimizationHint(try!(Self::read_linkedit_data::<O>(buf)))
820+
LoadCommand::LinkerOptimizationHint(try!(Self::read_linkedit_data::<O, T>(buf)))
829821
}
830822

831823
LC_VERSION_MIN_MACOSX |
@@ -858,9 +850,7 @@ impl LoadCommand {
858850
stacksize: try!(buf.read_u64::<O>()),
859851
}
860852
}
861-
LC_SOURCE_VERSION => {
862-
LoadCommand::SourceVersion(SourceVersionTag(try!(buf.read_u64::<O>())))
863-
}
853+
LC_SOURCE_VERSION => LoadCommand::SourceVersion(SourceVersionTag(try!(buf.read_u64::<O>()))),
864854
_ => {
865855
let mut payload = Vec::new();
866856

@@ -891,37 +881,37 @@ impl LoadCommand {
891881
Ok((cmd, cmdsize as usize))
892882
}
893883

894-
fn read_lc_string<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<String> {
884+
fn read_lc_string<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<String> {
895885
let mut s = Vec::new();
896886

897887
try!(buf.read_until(0, &mut s));
898888

899889
unsafe { Ok(String::from(try!(CStr::from_ptr(s.as_ptr() as *const i8).to_str()))) }
900890
}
901891

902-
fn read_dylinker<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<LcString> {
892+
fn read_dylinker<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<LcString> {
903893
let off = try!(buf.read_u32::<O>()) as usize;
904894

905895
buf.consume(off - 12);
906896

907-
Ok(LcString(off, try!(Self::read_lc_string::<O>(buf))))
897+
Ok(LcString(off, try!(Self::read_lc_string::<O, T>(buf))))
908898
}
909899

910-
fn read_fvmlib<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<FvmLib> {
900+
fn read_fvmlib<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<FvmLib> {
911901
let off = try!(buf.read_u32::<O>()) as usize;
912902
let minor_version = try!(buf.read_u32::<O>());
913903
let header_addr = try!(buf.read_u32::<O>());
914904

915905
buf.consume(off - 20);
916906

917907
Ok(FvmLib {
918-
name: LcString(off, try!(Self::read_lc_string::<O>(buf))),
908+
name: LcString(off, try!(Self::read_lc_string::<O, T>(buf))),
919909
minor_version: minor_version,
920910
header_addr: header_addr,
921911
})
922912
}
923913

924-
fn read_dylib<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<DyLib> {
914+
fn read_dylib<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<DyLib> {
925915
let off = try!(buf.read_u32::<O>()) as usize;
926916
let timestamp = try!(buf.read_u32::<O>());
927917
let current_version = try!(buf.read_u32::<O>());
@@ -930,14 +920,14 @@ impl LoadCommand {
930920
buf.consume(off - 24);
931921

932922
Ok(DyLib {
933-
name: LcString(off, try!(Self::read_lc_string::<O>(buf))),
923+
name: LcString(off, try!(Self::read_lc_string::<O, T>(buf))),
934924
timestamp: timestamp,
935925
current_version: VersionTag(current_version),
936926
compatibility_version: VersionTag(compatibility_version),
937927
})
938928
}
939929

940-
fn read_linkedit_data<O: ByteOrder>(buf: &mut Cursor<&[u8]>) -> Result<LinkEditData> {
930+
fn read_linkedit_data<O: ByteOrder, T: AsRef<[u8]>>(buf: &mut Cursor<T>) -> Result<LinkEditData> {
941931
Ok(LinkEditData {
942932
off: try!(buf.read_u32::<O>()),
943933
size: try!(buf.read_u32::<O>()),
@@ -1184,9 +1174,9 @@ pub mod tests {
11841174

11851175
buf.extend_from_slice(&$buf[..]);
11861176

1187-
let mut cur = Cursor::new(buf.as_slice());
1177+
let mut cur = Cursor::new(buf);
11881178

1189-
LoadCommand::parse::<LittleEndian>(&mut cur).unwrap()
1179+
LoadCommand::parse::<LittleEndian, Vec<u8>>(&mut cur).unwrap()
11901180
})
11911181
}
11921182

@@ -1346,8 +1336,7 @@ pub mod tests {
13461336

13471337
#[test]
13481338
fn test_parse_symtab_command() {
1349-
if let (LoadCommand::SymTab { symoff, nsyms, stroff, strsize }, cmdsize) =
1350-
parse_command!(LC_SYMTAB_DATA) {
1339+
if let (LoadCommand::SymTab { symoff, nsyms, stroff, strsize }, cmdsize) = parse_command!(LC_SYMTAB_DATA) {
13511340
assert_eq!(cmdsize, 24);
13521341
assert_eq!(symoff, 0x200d88);
13531342
assert_eq!(nsyms, 36797);
@@ -1405,8 +1394,7 @@ pub mod tests {
14051394

14061395
#[test]
14071396
fn test_parse_load_dylinker_command() {
1408-
if let (LoadCommand::LoadDyLinker(LcString(off, ref name)), cmdsize) =
1409-
parse_command!(LC_LOAD_DYLINKER_DATA) {
1397+
if let (LoadCommand::LoadDyLinker(LcString(off, ref name)), cmdsize) = parse_command!(LC_LOAD_DYLINKER_DATA) {
14101398
assert_eq!(cmdsize, 32);
14111399
assert_eq!(off, 12);
14121400
assert_eq!(name, "/usr/lib/dyld");
@@ -1429,7 +1417,7 @@ pub mod tests {
14291417
#[test]
14301418
fn test_parse_min_version_command() {
14311419
if let (LoadCommand::VersionMin { target, version, sdk }, cmdsize) =
1432-
parse_command!(LC_VERSION_MIN_MACOSX_DATA) {
1420+
parse_command!(LC_VERSION_MIN_MACOSX_DATA) {
14331421
assert_eq!(cmdsize, 16);
14341422
assert_eq!(target, BuildTarget::MacOsX);
14351423
assert_eq!(version.to_string(), "10.11");
@@ -1441,8 +1429,7 @@ pub mod tests {
14411429

14421430
#[test]
14431431
fn test_parse_source_version_command() {
1444-
if let (LoadCommand::SourceVersion(version), cmdsize) =
1445-
parse_command!(LC_SOURCE_VERSION_DATA) {
1432+
if let (LoadCommand::SourceVersion(version), cmdsize) = parse_command!(LC_SOURCE_VERSION_DATA) {
14461433
assert_eq!(cmdsize, 16);
14471434
assert_eq!(version.to_string(), "0.0");
14481435
} else {
@@ -1452,8 +1439,7 @@ pub mod tests {
14521439

14531440
#[test]
14541441
fn test_parse_main_command() {
1455-
if let (LoadCommand::EntryPoint { entryoff, stacksize }, cmdsize) =
1456-
parse_command!(LC_MAIN_DATA) {
1442+
if let (LoadCommand::EntryPoint { entryoff, stacksize }, cmdsize) = parse_command!(LC_MAIN_DATA) {
14571443
assert_eq!(cmdsize, 24);
14581444
assert_eq!(entryoff, 0x11400);
14591445
assert_eq!(stacksize, 0);
@@ -1479,16 +1465,15 @@ pub mod tests {
14791465
#[test]
14801466
fn test_parse_link_edit_data_command() {
14811467
if let (LoadCommand::FunctionStarts(LinkEditData { off, size }), cmdsize) =
1482-
parse_command!(LC_FUNCTION_STARTS_DATA) {
1468+
parse_command!(LC_FUNCTION_STARTS_DATA) {
14831469
assert_eq!(cmdsize, 16);
14841470
assert_eq!(off, 0x1fec50);
14851471
assert_eq!(size, 8504);
14861472
} else {
14871473
panic!();
14881474
}
14891475

1490-
if let (LoadCommand::DataInCode(LinkEditData { off, size }), cmdsize) =
1491-
parse_command!(LC_DATA_IN_CODE_DATA) {
1476+
if let (LoadCommand::DataInCode(LinkEditData { off, size }), cmdsize) = parse_command!(LC_DATA_IN_CODE_DATA) {
14921477
assert_eq!(cmdsize, 16);
14931478
assert_eq!(off, 0x200d88);
14941479
assert_eq!(size, 0);

0 commit comments

Comments
 (0)