Skip to content
  • David Gibson's avatar
    libfdt: Rework/cleanup fdt_next_tag() · a22d9cfb
    David Gibson authored
    
    
    Currently, callers of fdt_next_tag() must usually follow the call with
    some sort of call to fdt_offset_ptr() to verify that the blob isn't
    truncated in the middle of the tag data they're going to process.
    This is a bit silly, since fdt_next_tag() generally has to call
    fdt_offset_ptr() on at least some of the data following the tag for
    its own operation.
    
    This patch alters fdt_next_tag() to always use fdt_offset_ptr() to
    verify the data between its starting offset and the offset it returns
    in nextoffset.  This simplifies fdt_get_property() which no longer has
    to verify itself that the property data is all present.
    
    At the same time, I neaten and clarify the error handling for
    fdt_next_tag().  Previously, fdt_next_tag() could return -1 instead of
    a tag value in some circumstances - which almost none of the callers
    checked for.  Also, fdt_next_tag() could return FDT_END either because
    it encountered an FDT_END tag, or because it reached the end of the
    structure block - no way was provided to tell between these cases.
    
    With this patch, fdt_next_tag() always returns FDT_END with a negative
    value in nextoffset for an error.  This means the several places which
    loop looking for FDT_END will still work correctly - they only need to
    check for errors at the end.  The errors which fdt_next_tag() can
    report are:
    	- -FDT_ERR_TRUNCATED if it reached the end of the structure
    	   block instead of finding a tag.
    
    	- -FDT_BADSTRUCTURE if a bad tag was encountered, or if the
               tag data couldn't be verified with fdt_offset_ptr().
    
    This patch also updates the callers of fdt_next_tag(), where
    appropriate, to make use of the new error reporting.
    
    Finally, the prototype for the long gone _fdt_next_tag() is removed
    from libfdt_internal.h.
    
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    a22d9cfb