Skip to content

Commit 0394c66

Browse files
committed
optionally truncate extracted ME binary
This essentially behaves like me_cleaner, but may result in a smaller file. Signed-off-by: Daniel Maslowski <[email protected]>
1 parent 7943380 commit 0394c66

File tree

3 files changed

+20
-14
lines changed

3 files changed

+20
-14
lines changed

src/clean.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use intel_fw::{
2+
EMPTY,
23
ifd::{IFD, IfdError},
34
me::ME,
45
part::part::ClearOptions,
@@ -19,7 +20,7 @@ pub fn clean(
1920
me: &ME,
2021
data: &mut [u8],
2122
options: Options,
22-
) -> Result<Vec<u8>, String> {
23+
) -> Result<(Vec<u8>, Option<Vec<u8>>), String> {
2324
if (options.disable_me || options.disable_me_only)
2425
&& let Ok(ifd) = ifd
2526
{
@@ -36,7 +37,7 @@ pub fn clean(
3637
data[..size].copy_from_slice(&new_ifd);
3738
}
3839
if options.disable_me_only {
39-
return Ok(data.to_vec());
40+
return Ok((data.to_vec(), None));
4041
}
4142
}
4243
let mut new_me = me.clone();
@@ -55,7 +56,12 @@ pub fn clean(
5556
Ok(cleaned) => {
5657
let size = cleaned.len();
5758
data[me.base..me.base + size].copy_from_slice(&cleaned);
58-
Ok(data.to_vec())
59+
60+
// Fill up to fully cover the FPT area, clear out remaining bytes.
61+
let original_size = new_me.fpt_area.original_size;
62+
data[me.base + size..me.base + original_size].fill(EMPTY);
63+
64+
Ok((data.to_vec(), Some(cleaned)))
5965
}
6066
Err(e) => Err(e),
6167
}

src/main.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ fn main() -> Result<(), io::Error> {
220220
parts_force_deletion: blacklist.unwrap_or(vec![]),
221221
};
222222
match clean::clean(&fw.ifd, &me, &mut data, opts) {
223-
Ok(data) => {
223+
Ok((data, me_data)) => {
224224
if let Some(f) = output {
225225
let mut f = fs::File::create(f)?;
226226
f.write_all(&data)?;
@@ -235,8 +235,12 @@ fn main() -> Result<(), io::Error> {
235235
}
236236
if let Some(f) = extract_me {
237237
let mut f = fs::File::create(f)?;
238-
let me_range = ifd.regions.me_range();
239-
f.write_all(&data[me_range])?;
238+
if truncate && let Some(me_data) = me_data {
239+
f.write_all(&me_data)?;
240+
} else {
241+
let me_range = ifd.regions.me_range();
242+
f.write_all(&data[me_range])?;
243+
}
240244
}
241245
}
242246
}

src/me.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,16 +191,12 @@ impl FPTArea {
191191
}
192192

193193
let mut res = self.partitions.to_vec()?;
194+
// Round to next 4k
195+
let min_size = res.len().next_multiple_of(4096);
194196
if debug {
195-
println!(" Minimum size: {:08x}", res.len());
196-
}
197-
// Restore the original size, so that the resulting slice fully covers
198-
// the FPT area. The resulting bytes can be used to overwrite the region
199-
// in a given image, e.g., after cleaning or other partition changes.
200-
res.resize(self.original_size, EMPTY);
201-
if debug {
202-
println!(" Restored size: {:08x}", res.len());
197+
println!(" Minimum size: {:08x}", min_size);
203198
}
199+
res.resize(min_size, EMPTY);
204200

205201
// Any range within the FPT area may be non-covered.
206202
for u in &self.non_covered {

0 commit comments

Comments
 (0)