@@ -540,6 +540,7 @@ impl<'a> PE<'a> {
540
540
const MAX_PE_RESOURCES : usize = 65536 ;
541
541
const MAX_DIR_ENTRIES : usize = 16 ;
542
542
const MAX_FUNC_NAME_LENGTH : usize = 1024 ;
543
+ const MAX_DLL_NAME_LENGTH : usize = 512 ;
543
544
544
545
fn parse_dos_header ( input : & [ u8 ] ) -> IResult < & [ u8 ] , DOSHeader > {
545
546
map (
@@ -2136,7 +2137,8 @@ impl<'a> PE<'a> {
2136
2137
} )
2137
2138
{
2138
2139
if let Some ( name_rva) = names. get ( idx) {
2139
- f. name = self . str_at_rva ( * name_rva) ;
2140
+ f. name =
2141
+ self . str_at_rva ( * name_rva, Self :: MAX_FUNC_NAME_LENGTH ) ;
2140
2142
}
2141
2143
}
2142
2144
@@ -2146,7 +2148,8 @@ impl<'a> PE<'a> {
2146
2148
// really pointing to the function, but to a ASCII string that
2147
2149
// contains the DLL and function to which this export is forwarded.
2148
2150
if exports_section. contains ( & f. rva ) {
2149
- f. forward_name = self . str_at_rva ( f. rva ) ;
2151
+ f. forward_name =
2152
+ self . str_at_rva ( f. rva , Self :: MAX_FUNC_NAME_LENGTH ) ;
2150
2153
} else {
2151
2154
f. offset = self . rva_to_offset ( f. rva ) ;
2152
2155
}
@@ -2215,17 +2218,17 @@ impl<'a> PE<'a> {
2215
2218
parser. parse ( data) . map ( |( _, result) | result) . ok ( )
2216
2219
}
2217
2220
2218
- fn str_at_rva ( & self , rva : u32 ) -> Option < & ' a str > {
2219
- let dll_name = self . parse_at_rva ( rva, take_till ( |c| c == 0 ) ) ? ;
2220
- from_utf8 ( dll_name ) . ok ( )
2221
+ fn str_at_rva ( & self , rva : u32 , max_len : usize ) -> Option < & ' a str > {
2222
+ self . parse_at_rva ( rva, take_while_m_n ( 0 , max_len , |c| c != 0 ) )
2223
+ . map ( |s| from_utf8 ( s ) . ok ( ) ) ?
2221
2224
}
2222
2225
2223
2226
fn dll_name_at_rva ( & self , rva : u32 ) -> Option < & ' a str > {
2224
2227
// TODO: this enforces the DLL name to be valid UTF-8. Is this too
2225
2228
// restrictive? YARA is using a more relaxed approach and accepts
2226
2229
// every byte except the ones listed below. YARA imposes a length
2227
2230
// limit of 256 bytes, though.
2228
- let dll_name = self . str_at_rva ( rva) ?;
2231
+ let dll_name = self . str_at_rva ( rva, Self :: MAX_DLL_NAME_LENGTH ) ?;
2229
2232
2230
2233
for c in dll_name. chars ( ) {
2231
2234
if c. is_ascii_control ( ) {
0 commit comments