Correctly handle truncated dtb

This commit is contained in:
LoveSy 2025-02-23 23:14:28 +08:00 committed by John Wu
parent 0399cde50a
commit e55c413261

View File

@ -1,10 +1,7 @@
use std::{cell::UnsafeCell, process::exit}; use std::{cell::UnsafeCell, process::exit};
use argh::FromArgs; use argh::FromArgs;
use fdt::{ use fdt::{node::{FdtNode, NodeProperty}, Fdt, FdtError};
node::{FdtNode, NodeProperty},
Fdt,
};
use base::{ use base::{
libc::c_char, log_err, map_args, EarlyExitExt, LoggedResult, MappedFile, ResultExt, Utf8CStr, libc::c_char, log_err, map_args, EarlyExitExt, LoggedResult, MappedFile, ResultExt, Utf8CStr,
@ -171,15 +168,17 @@ fn for_each_fdt<F: FnMut(usize, Fdt) -> LoggedResult<()>>(
if slice.len() < 40 { if slice.len() < 40 {
break; break;
} }
let fdt = Fdt::new(slice)?; let fdt = match Fdt::new(slice) {
Err(FdtError::BufferTooSmall) => {
eprintln!("dtb.{:04} is truncated", dtb_num);
break;
},
Ok(fdt) => fdt,
e => e?,
};
let size = fdt.total_size(); let size = fdt.total_size();
if size > slice.len() {
eprintln!("dtb.{:04} is truncated", dtb_num);
break;
}
f(dtb_num, fdt)?; f(dtb_num, fdt)?;
dtb_num += 1; dtb_num += 1;