Changeset 0d851d4 in rtems for cpukit/dtc


Ignore:
Timestamp:
Mar 17, 2018, 1:12:12 PM (20 months ago)
Author:
David Gibson <david@…>
Branches:
master
Children:
3848f14b
Parents:
9a7de8e
git-author:
David Gibson <david@…> (03/17/18 13:12:12)
git-committer:
Sebastian Huber <sebastian.huber@…> (07/19/18 05:01:12)
Message:

libfdt: Add fdt_check_full() function

This new function implements a complete and thorough check of an fdt blob's
structure. Given a buffer containing an fdt, it should return 0 only if
the fdt within is structurally sound in all regards. It doesn't check
anything about the blob's contents (i.e. the actual values of the nodes and
properties), of course.

Signed-off-by: David Gibson <david@…>
Tested-by: Alexey Kardashevskiy <aik@…>
Reviewed-by: Alexey Kardashevskiy <aik@…>
Reviewed-by: Simon Glass <sjg@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/dtc/libfdt/fdt_ro.c

    r9a7de8e r0d851d4  
    858858        return offset; /* error from fdt_next_node() */
    859859}
     860
     861int fdt_check_full(const void *fdt, size_t bufsize)
     862{
     863        int err;
     864        int num_memrsv;
     865        int offset, nextoffset = 0;
     866        uint32_t tag;
     867        unsigned depth = 0;
     868        const void *prop;
     869        const char *propname;
     870
     871        if (bufsize < FDT_V1_SIZE)
     872                return -FDT_ERR_TRUNCATED;
     873        err = fdt_check_header(fdt);
     874        if (err != 0)
     875                return err;
     876        if (bufsize < fdt_totalsize(fdt))
     877                return -FDT_ERR_TRUNCATED;
     878
     879        num_memrsv = fdt_num_mem_rsv(fdt);
     880        if (num_memrsv < 0)
     881                return num_memrsv;
     882
     883        while (1) {
     884                offset = nextoffset;
     885                tag = fdt_next_tag(fdt, offset, &nextoffset);
     886
     887                if (nextoffset < 0)
     888                        return nextoffset;
     889
     890                switch (tag) {
     891                case FDT_NOP:
     892                        break;
     893
     894                case FDT_END:
     895                        if (depth != 0)
     896                                return -FDT_ERR_BADSTRUCTURE;
     897                        return 0;
     898
     899                case FDT_BEGIN_NODE:
     900                        depth++;
     901                        if (depth > INT_MAX)
     902                                return -FDT_ERR_BADSTRUCTURE;
     903                        break;
     904
     905                case FDT_END_NODE:
     906                        if (depth == 0)
     907                                return -FDT_ERR_BADSTRUCTURE;
     908                        depth--;
     909                        break;
     910
     911                case FDT_PROP:
     912                        prop = fdt_getprop_by_offset(fdt, offset, &propname,
     913                                                     &err);
     914                        if (!prop)
     915                                return err;
     916                        break;
     917
     918                default:
     919                        return -FDT_ERR_INTERNAL;
     920                }
     921        }
     922}
Note: See TracChangeset for help on using the changeset viewer.