projects
/
oweals
/
u-boot.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ppc4xx: Fixed compilation warning in 4xx_enet.c
[oweals/u-boot.git]
/
libfdt
/
fdt.c
diff --git
a/libfdt/fdt.c
b/libfdt/fdt.c
index bd91712378b52a0ce6ecd91c61c63a98124585e8..b09ea6f04d0a04abd14d32ab82da329783432b6e 100644
(file)
--- a/
libfdt/fdt.c
+++ b/
libfdt/fdt.c
@@
-50,8
+50,12
@@
*/
#include "libfdt_env.h"
*/
#include "libfdt_env.h"
+#ifndef USE_HOSTCC
#include <fdt.h>
#include <libfdt.h>
#include <fdt.h>
#include <libfdt.h>
+#else
+#include "fdt_host.h"
+#endif
#include "libfdt_internal.h"
#include "libfdt_internal.h"
@@
-63,7
+67,7
@@
int fdt_check_header(const void *fdt)
return -FDT_ERR_BADVERSION;
if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
return -FDT_ERR_BADVERSION;
return -FDT_ERR_BADVERSION;
if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
return -FDT_ERR_BADVERSION;
- } else if (fdt_magic(fdt) == SW_MAGIC) {
+ } else if (fdt_magic(fdt) ==
FDT_
SW_MAGIC) {
/* Unfinished sequential-write blob */
if (fdt_size_dt_struct(fdt) == 0)
return -FDT_ERR_BADSTATE;
/* Unfinished sequential-write blob */
if (fdt_size_dt_struct(fdt) == 0)
return -FDT_ERR_BADSTATE;
@@
-74,9
+78,9
@@
int fdt_check_header(const void *fdt)
return 0;
}
return 0;
}
-const void *fdt_offset_ptr(const void *fdt, int offset, int len)
+const void *fdt_offset_ptr(const void *fdt, int offset,
unsigned
int len)
{
{
- const
void
*p;
+ const
char
*p;
if (fdt_version(fdt) >= 0x11)
if (((offset + len) < offset)
if (fdt_version(fdt) >= 0x11)
if (((offset + len) < offset)
@@
-90,55
+94,73
@@
const void *fdt_offset_ptr(const void *fdt, int offset, int len)
return p;
}
return p;
}
-uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
+uint32_t fdt_next_tag(const void *fdt, int
start
offset, int *nextoffset)
{
const uint32_t *tagp, *lenp;
uint32_t tag;
{
const uint32_t *tagp, *lenp;
uint32_t tag;
+ int offset = startoffset;
const char *p;
const char *p;
- if (offset % FDT_TAGSIZE)
- return -1;
-
+ *nextoffset = -FDT_ERR_TRUNCATED;
tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
- if (!
tagp)
+ if (!tagp)
return FDT_END; /* premature end */
tag = fdt32_to_cpu(*tagp);
offset += FDT_TAGSIZE;
return FDT_END; /* premature end */
tag = fdt32_to_cpu(*tagp);
offset += FDT_TAGSIZE;
+ *nextoffset = -FDT_ERR_BADSTRUCTURE;
switch (tag) {
case FDT_BEGIN_NODE:
/* skip name */
do {
p = fdt_offset_ptr(fdt, offset++, 1);
} while (p && (*p != '\0'));
switch (tag) {
case FDT_BEGIN_NODE:
/* skip name */
do {
p = fdt_offset_ptr(fdt, offset++, 1);
} while (p && (*p != '\0'));
- if (!
p)
- return FDT_END;
+ if (!p)
+ return FDT_END;
/* premature end */
break;
break;
+
case FDT_PROP:
lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
case FDT_PROP:
lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
- if (! lenp)
- return FDT_END;
- /* skip name offset, length and value */
- offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
+ if (!lenp)
+ return FDT_END; /* premature end */
+ /* skip-name offset, length and value */
+ offset += sizeof(struct fdt_property) - FDT_TAGSIZE
+ + fdt32_to_cpu(*lenp);
+ break;
+
+ case FDT_END:
+ case FDT_END_NODE:
+ case FDT_NOP:
break;
break;
+
+ default:
+ return FDT_END;
}
}
- if (
nextoffset
)
- *nextoffset = ALIGN(offset, FDT_TAGSIZE);
+ if (
!fdt_offset_ptr(fdt, startoffset, offset - startoffset)
)
+ return FDT_END; /* premature end */
+ *nextoffset = FDT_TAGALIGN(offset);
return tag;
}
return tag;
}
+int _fdt_check_node_offset(const void *fdt, int offset)
+{
+ if ((offset < 0) || (offset % FDT_TAGSIZE)
+ || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE))
+ return -FDT_ERR_BADOFFSET;
+
+ return offset;
+}
+
int fdt_next_node(const void *fdt, int offset, int *depth)
{
int nextoffset = 0;
uint32_t tag;
int fdt_next_node(const void *fdt, int offset, int *depth)
{
int nextoffset = 0;
uint32_t tag;
- if (offset >= 0) {
- tag = fdt_next_tag(fdt, offset, &nextoffset);
- if (tag != FDT_BEGIN_NODE)
- return -FDT_ERR_BADOFFSET;
- }
+ if (offset >= 0)
+ if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
+ return nextoffset;
do {
offset = nextoffset;
do {
offset = nextoffset;
@@
-155,15
+177,16
@@
int fdt_next_node(const void *fdt, int offset, int *depth)
break;
case FDT_END_NODE:
break;
case FDT_END_NODE:
- if (depth)
-
(*depth)--
;
+ if (depth
&& ((--(*depth)) < 0)
)
+
return nextoffset
;
break;
case FDT_END:
break;
case FDT_END:
- return -FDT_ERR_NOTFOUND;
-
- default:
- return -FDT_ERR_BADSTRUCTURE;
+ if ((nextoffset >= 0)
+ || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth))
+ return -FDT_ERR_NOTFOUND;
+ else
+ return nextoffset;
}
} while (tag != FDT_BEGIN_NODE);
}
} while (tag != FDT_BEGIN_NODE);
@@
-177,14
+200,14
@@
const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
const char *p;
for (p = strtab; p <= last; p++)
const char *p;
for (p = strtab; p <= last; p++)
- if (mem
eq(p, s, len)
)
+ if (mem
cmp(p, s, len) == 0
)
return p;
return NULL;
}
int fdt_move(const void *fdt, void *buf, int bufsize)
{
return p;
return NULL;
}
int fdt_move(const void *fdt, void *buf, int bufsize)
{
- CHECK_HEADER(fdt);
+
FDT_
CHECK_HEADER(fdt);
if (fdt_totalsize(fdt) > bufsize)
return -FDT_ERR_NOSPACE;
if (fdt_totalsize(fdt) > bufsize)
return -FDT_ERR_NOSPACE;