(loc: Location)
| 150 | |
| 151 | impl ElfCacheEntry { |
| 152 | fn load(loc: Location) -> AxResult<Result<Self, Vec<u8>>> { |
| 153 | let cache = CachedFile::get_or_create(loc); |
| 154 | |
| 155 | let mut data = vec![0; 4096]; |
| 156 | let read = cache.read_at(&mut data[..], 0)?; |
| 157 | data.truncate(read); |
| 158 | match ElfCacheEntry::try_new_or_recover::<AxError>(cache.clone(), data, |data| { |
| 159 | let builder = ELFHeadersBuilder::new(data).map_err(map_elf_error)?; |
| 160 | let range = builder.ph_range(); |
| 161 | if range.end as usize <= data.len() { |
| 162 | builder.build(&data[range.start as usize..range.end as usize]) |
| 163 | } else { |
| 164 | let mut buf = vec![0; (range.end - range.start) as usize]; |
| 165 | cache.read_at(&mut buf[..], range.start)?; |
| 166 | builder.build(&buf) |
| 167 | } |
| 168 | .map_err(map_elf_error) |
| 169 | }) { |
| 170 | Ok(e) => Ok(Ok(e)), |
| 171 | Err((_, heads)) => Ok(Err(heads.data)), |
| 172 | } |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | struct ElfLoader(LRUCache<ElfCacheEntry, 32>); |
no test coverage detected