Browse Source

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>
main
Frank Mehnert 4 years ago committed by David Gibson
parent
commit
7bb86f1c09
  1. 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;

Loading…
Cancel
Save