libfdt: fix fdt_check_node_offset_ w/ VALID_INPUT
fdt_check_node_offset_() checks for a valid offset but also changes the offset by calling fdt_next_tag(). Hence, do not skip this function if ASSUME_VALID_INPUT is set but only omit the initial offset check in that case. As this function works very similar to fdt_check_prop_offset_(), do the offset check there as well depending on ASSUME_VALID_INPUT. Message-Id: <1913141.TlUzK5foHS@noys4> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
committed by
David Gibson
parent
3d522abc75
commit
7bb86f1c09
16
libfdt/fdt.c
16
libfdt/fdt.c
@@ -206,10 +206,11 @@ uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
|
|||||||
|
|
||||||
int fdt_check_node_offset_(const void *fdt, int offset)
|
int fdt_check_node_offset_(const void *fdt, int offset)
|
||||||
{
|
{
|
||||||
if (can_assume(VALID_INPUT))
|
if (!can_assume(VALID_INPUT)
|
||||||
return offset;
|
&& ((offset < 0) || (offset % FDT_TAGSIZE)))
|
||||||
if ((offset < 0) || (offset % FDT_TAGSIZE)
|
return -FDT_ERR_BADOFFSET;
|
||||||
|| (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE))
|
|
||||||
|
if (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)
|
||||||
return -FDT_ERR_BADOFFSET;
|
return -FDT_ERR_BADOFFSET;
|
||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
@@ -217,8 +218,11 @@ int fdt_check_node_offset_(const void *fdt, int offset)
|
|||||||
|
|
||||||
int fdt_check_prop_offset_(const void *fdt, int offset)
|
int fdt_check_prop_offset_(const void *fdt, int offset)
|
||||||
{
|
{
|
||||||
if ((offset < 0) || (offset % FDT_TAGSIZE)
|
if (!can_assume(VALID_INPUT)
|
||||||
|| (fdt_next_tag(fdt, offset, &offset) != FDT_PROP))
|
&& ((offset < 0) || (offset % FDT_TAGSIZE)))
|
||||||
|
return -FDT_ERR_BADOFFSET;
|
||||||
|
|
||||||
|
if (fdt_next_tag(fdt, offset, &offset) != FDT_PROP)
|
||||||
return -FDT_ERR_BADOFFSET;
|
return -FDT_ERR_BADOFFSET;
|
||||||
|
|
||||||
return offset;
|
return offset;
|
||||||
|
|||||||
Reference in New Issue
Block a user