1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

use super::super::nom::{
    le_u32, be_u32,
    le_i32, be_i32,
    IResult,
};
use super::super::{
    Fault,
    ElfClass, Class,
    ElfEndian, Endian
};


struct PreRel32 {
    r_offset: u32,
    r_info: u32
}
impl PreRel32 {
    fn new<E>(buffer: &[u8], elf: &E)
        -> Result<PreRel32,Fault>
        where E: Class+Endian+?Sized
    {
        named!(parser_pre_rel32_le<PreRel32>, do_parse!(
            r_offset: le_u32 >>
            r_info: le_u32 >>
            ((PreRel32{ r_offset, r_info }))
        ));
        named!(parser_pre_rel32_be<PreRel32>, do_parse!(
            r_offset: be_u32 >>
            r_info: be_u32 >>
            ((PreRel32{ r_offset, r_info }))
        ));
        if elf.is_64bits() {
            return Err(Fault::Bits32ParserFailed);
        }
        if buffer.len() >= 8 {
            let data = match elf.get_endian() {
                ElfEndian::Little => parser_pre_rel32_le(buffer),
                ElfEndian::Big => parser_pre_rel32_be(buffer)
            };
            match data {
                IResult::Done(_,x) => Ok(x),
                IResult::Error(_) => Err(Fault::Complex),
                IResult::Incomplete(_) => Err(Fault::TooSmol)
            }
        } else {
            Err(Fault::TooSmol)
        }
    }
}
struct PreRela32 {
    r_offset: u32,
    r_info: u32,
    r_addend: i32,
}
impl PreRela32 {
    fn new<E>(buffer: &[u8], elf: &E)
        -> Result<PreRela32,Fault>
        where E: Class+Endian+?Sized
    {
        named!(parse_pre_rela32_le<PreRela32>, do_parse!(
            r_offset: le_u32 >>
            r_info: le_u32 >>
            r_addend: le_i32 >>
            ((PreRela32{ r_offset, r_info, r_addend }))
        ));
        named!(parse_pre_rela32_be<PreRela32>, do_parse!(
            r_offset: be_u32 >>
            r_info: be_u32 >>
            r_addend: be_i32 >>
            ((PreRela32{ r_offset, r_info, r_addend }))
        ));
        if elf.is_64bits() {
            return Err(Fault::Bits32ParserFailed);
        }
        if buffer.len() >= 12 {
            let data = match elf.get_endian() {
                ElfEndian::Little => parse_pre_rela32_le(buffer),
                ElfEndian::Big => parse_pre_rela32_be(buffer)
            };
            match data {
                IResult::Done(_,x) => Ok(x),
                IResult::Error(_) => Err(Fault::Complex),
                IResult::Incomplete(_) => Err(Fault::TooSmol)
            }
        } else {
            Err(Fault::TooSmol)
        }
    }
}