mirror of
https://github.com/dgibson/dtc.git
synced 2025-10-14 00:37:41 -04:00
libfdt: Add support for disabling dtb checks
Support ASSUME_VALID_DTB to disable some sanity checks If we assume that the DTB itself is valid then we can skip some checks and save code space. Add various conditions to handle this. Signed-off-by: Simon Glass <sjg@chromium.org> Message-Id: <20200220214557.176528-4-sjg@chromium.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
464962489d
commit
57bc6327b8
4 changed files with 47 additions and 31 deletions
21
libfdt/fdt.c
21
libfdt/fdt.c
|
@ -19,6 +19,9 @@ int32_t fdt_ro_probe_(const void *fdt)
|
||||||
{
|
{
|
||||||
uint32_t totalsize = fdt_totalsize(fdt);
|
uint32_t totalsize = fdt_totalsize(fdt);
|
||||||
|
|
||||||
|
if (can_assume(VALID_DTB))
|
||||||
|
return totalsize;
|
||||||
|
|
||||||
if (fdt_magic(fdt) == FDT_MAGIC) {
|
if (fdt_magic(fdt) == FDT_MAGIC) {
|
||||||
/* Complete tree */
|
/* Complete tree */
|
||||||
if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|
if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|
||||||
|
@ -81,21 +84,25 @@ int fdt_check_header(const void *fdt)
|
||||||
|
|
||||||
if (fdt_magic(fdt) != FDT_MAGIC)
|
if (fdt_magic(fdt) != FDT_MAGIC)
|
||||||
return -FDT_ERR_BADMAGIC;
|
return -FDT_ERR_BADMAGIC;
|
||||||
hdrsize = fdt_header_size(fdt);
|
|
||||||
if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|
if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
|
||||||
|| (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION))
|
|| (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION))
|
||||||
return -FDT_ERR_BADVERSION;
|
return -FDT_ERR_BADVERSION;
|
||||||
if (fdt_version(fdt) < fdt_last_comp_version(fdt))
|
if (fdt_version(fdt) < fdt_last_comp_version(fdt))
|
||||||
return -FDT_ERR_BADVERSION;
|
return -FDT_ERR_BADVERSION;
|
||||||
|
hdrsize = fdt_header_size(fdt);
|
||||||
|
if (!can_assume(VALID_DTB)) {
|
||||||
|
|
||||||
if ((fdt_totalsize(fdt) < hdrsize)
|
if ((fdt_totalsize(fdt) < hdrsize)
|
||||||
|| (fdt_totalsize(fdt) > INT_MAX))
|
|| (fdt_totalsize(fdt) > INT_MAX))
|
||||||
return -FDT_ERR_TRUNCATED;
|
return -FDT_ERR_TRUNCATED;
|
||||||
|
|
||||||
/* Bounds check memrsv block */
|
/* Bounds check memrsv block */
|
||||||
if (!check_off_(hdrsize, fdt_totalsize(fdt), fdt_off_mem_rsvmap(fdt)))
|
if (!check_off_(hdrsize, fdt_totalsize(fdt),
|
||||||
|
fdt_off_mem_rsvmap(fdt)))
|
||||||
return -FDT_ERR_TRUNCATED;
|
return -FDT_ERR_TRUNCATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!can_assume(VALID_DTB)) {
|
||||||
/* Bounds check structure block */
|
/* Bounds check structure block */
|
||||||
if (fdt_version(fdt) < 17) {
|
if (fdt_version(fdt) < 17) {
|
||||||
if (!check_off_(hdrsize, fdt_totalsize(fdt),
|
if (!check_off_(hdrsize, fdt_totalsize(fdt),
|
||||||
|
@ -110,8 +117,10 @@ int fdt_check_header(const void *fdt)
|
||||||
|
|
||||||
/* Bounds check strings block */
|
/* Bounds check strings block */
|
||||||
if (!check_block_(hdrsize, fdt_totalsize(fdt),
|
if (!check_block_(hdrsize, fdt_totalsize(fdt),
|
||||||
fdt_off_dt_strings(fdt), fdt_size_dt_strings(fdt)))
|
fdt_off_dt_strings(fdt),
|
||||||
|
fdt_size_dt_strings(fdt)))
|
||||||
return -FDT_ERR_TRUNCATED;
|
return -FDT_ERR_TRUNCATED;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -142,7 +151,7 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||||
|
|
||||||
*nextoffset = -FDT_ERR_TRUNCATED;
|
*nextoffset = -FDT_ERR_TRUNCATED;
|
||||||
tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
|
tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
|
||||||
if (!tagp)
|
if (!can_assume(VALID_DTB) && !tagp)
|
||||||
return FDT_END; /* premature end */
|
return FDT_END; /* premature end */
|
||||||
tag = fdt32_to_cpu(*tagp);
|
tag = fdt32_to_cpu(*tagp);
|
||||||
offset += FDT_TAGSIZE;
|
offset += FDT_TAGSIZE;
|
||||||
|
@ -154,13 +163,13 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
||||||
do {
|
do {
|
||||||
p = fdt_offset_ptr(fdt, offset++, 1);
|
p = fdt_offset_ptr(fdt, offset++, 1);
|
||||||
} while (p && (*p != '\0'));
|
} while (p && (*p != '\0'));
|
||||||
if (!p)
|
if (!can_assume(VALID_DTB) && !p)
|
||||||
return FDT_END; /* premature end */
|
return FDT_END; /* premature end */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FDT_PROP:
|
case FDT_PROP:
|
||||||
lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
|
lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
|
||||||
if (!lenp)
|
if (!can_assume(VALID_DTB) && !lenp)
|
||||||
return FDT_END; /* premature end */
|
return FDT_END; /* premature end */
|
||||||
/* skip-name offset, length and value */
|
/* skip-name offset, length and value */
|
||||||
offset += sizeof(struct fdt_property) - FDT_TAGSIZE
|
offset += sizeof(struct fdt_property) - FDT_TAGSIZE
|
||||||
|
|
|
@ -388,7 +388,8 @@ static const struct fdt_property *fdt_get_property_namelen_(const void *fdt,
|
||||||
(offset = fdt_next_property_offset(fdt, offset))) {
|
(offset = fdt_next_property_offset(fdt, offset))) {
|
||||||
const struct fdt_property *prop;
|
const struct fdt_property *prop;
|
||||||
|
|
||||||
if (!(prop = fdt_get_property_by_offset_(fdt, offset, lenp))) {
|
prop = fdt_get_property_by_offset_(fdt, offset, lenp);
|
||||||
|
if (!can_assume(VALID_DTB) && !prop) {
|
||||||
offset = -FDT_ERR_INTERNAL;
|
offset = -FDT_ERR_INTERNAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,8 @@ static int fdt_blocks_misordered_(const void *fdt,
|
||||||
|
|
||||||
static int fdt_rw_probe_(void *fdt)
|
static int fdt_rw_probe_(void *fdt)
|
||||||
{
|
{
|
||||||
|
if (can_assume(VALID_DTB))
|
||||||
|
return 0;
|
||||||
FDT_RO_PROBE(fdt);
|
FDT_RO_PROBE(fdt);
|
||||||
|
|
||||||
if (fdt_version(fdt) < 17)
|
if (fdt_version(fdt) < 17)
|
||||||
|
|
|
@ -12,10 +12,13 @@
|
||||||
|
|
||||||
static int fdt_sw_probe_(void *fdt)
|
static int fdt_sw_probe_(void *fdt)
|
||||||
{
|
{
|
||||||
|
if (!can_assume(VALID_DTB)) {
|
||||||
if (fdt_magic(fdt) == FDT_MAGIC)
|
if (fdt_magic(fdt) == FDT_MAGIC)
|
||||||
return -FDT_ERR_BADSTATE;
|
return -FDT_ERR_BADSTATE;
|
||||||
else if (fdt_magic(fdt) != FDT_SW_MAGIC)
|
else if (fdt_magic(fdt) != FDT_SW_MAGIC)
|
||||||
return -FDT_ERR_BADMAGIC;
|
return -FDT_ERR_BADMAGIC;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +41,7 @@ static int fdt_sw_probe_memrsv_(void *fdt)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (fdt_off_dt_strings(fdt) != 0)
|
if (!can_assume(VALID_DTB) && fdt_off_dt_strings(fdt) != 0)
|
||||||
return -FDT_ERR_BADSTATE;
|
return -FDT_ERR_BADSTATE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -151,7 +154,8 @@ int fdt_resize(void *fdt, void *buf, int bufsize)
|
||||||
headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
|
headsize = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
|
||||||
tailsize = fdt_size_dt_strings(fdt);
|
tailsize = fdt_size_dt_strings(fdt);
|
||||||
|
|
||||||
if ((headsize + tailsize) > fdt_totalsize(fdt))
|
if (!can_assume(VALID_DTB) &&
|
||||||
|
headsize + tailsize > fdt_totalsize(fdt))
|
||||||
return -FDT_ERR_INTERNAL;
|
return -FDT_ERR_INTERNAL;
|
||||||
|
|
||||||
if ((headsize + tailsize) > bufsize)
|
if ((headsize + tailsize) > bufsize)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue