summaryrefslogtreecommitdiff
path: root/boot/fdt_support.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/fdt_support.c')
-rw-r--r--boot/fdt_support.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/boot/fdt_support.c b/boot/fdt_support.c
index 1c215e548db..2941df55996 100644
--- a/boot/fdt_support.c
+++ b/boot/fdt_support.c
@@ -160,6 +160,12 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)
goto noalias;
}
+ if (len > (int)sizeof(tmp)) {
+ debug("%s: %s alias path too long (%d bytes)\n",
+ __func__, sername, len);
+ return -FDT_ERR_NOSPACE;
+ }
+
/* fdt_setprop may break "path" so we copy it to tmp buffer */
memcpy(tmp, path, len);
@@ -545,13 +551,13 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
if (banks > MEMORY_BANKS_MAX) {
printf("%s: num banks %d exceeds hardcoded limit %d."
" Recompile with higher MEMORY_BANKS_MAX?\n",
- __FUNCTION__, banks, MEMORY_BANKS_MAX);
+ __func__, banks, MEMORY_BANKS_MAX);
return -1;
}
err = fdt_check_header(blob);
if (err < 0) {
- printf("%s: %s\n", __FUNCTION__, fdt_strerror(err));
+ printf("%s: %s\n", __func__, fdt_strerror(err));
return err;
}
@@ -1497,7 +1503,7 @@ static u64 __of_translate_address(const void *blob, int node_offset,
/* Cound address cells & copy address locally */
bus->count_cells(blob, parent, &na, &ns);
if (!OF_CHECK_COUNTS(na, ns)) {
- printf("%s: Bad cell count for %s\n", __FUNCTION__,
+ printf("%s: Bad cell count for %s\n", __func__,
fdt_get_name(blob, node_offset, NULL));
goto bail;
}
@@ -1524,8 +1530,8 @@ static u64 __of_translate_address(const void *blob, int node_offset,
pbus = of_match_bus(blob, parent);
pbus->count_cells(blob, parent, &pna, &pns);
if (!OF_CHECK_COUNTS(pna, pns)) {
- printf("%s: Bad cell count for %s\n", __FUNCTION__,
- fdt_get_name(blob, node_offset, NULL));
+ printf("%s: Bad cell count for %s\n", __func__,
+ fdt_get_name(blob, node_offset, NULL));
break;
}
@@ -1612,7 +1618,7 @@ int fdt_get_dma_range(const void *blob, int node, phys_addr_t *cpu,
bus_node = of_match_bus(blob, node);
bus_node->count_cells(blob, node, &na, &ns);
if (!OF_CHECK_COUNTS(na, ns)) {
- printf("%s: Bad cell count for %s\n", __FUNCTION__,
+ printf("%s: Bad cell count for %s\n", __func__,
fdt_get_name(blob, node, NULL));
return -EINVAL;
goto out;
@@ -1621,12 +1627,19 @@ int fdt_get_dma_range(const void *blob, int node, phys_addr_t *cpu,
bus_node = of_match_bus(blob, parent);
bus_node->count_cells(blob, parent, &pna, &pns);
if (!OF_CHECK_COUNTS(pna, pns)) {
- printf("%s: Bad cell count for %s\n", __FUNCTION__,
+ printf("%s: Bad cell count for %s\n", __func__,
fdt_get_name(blob, parent, NULL));
return -EINVAL;
goto out;
}
+ if (len < (int)((na + pna + ns) * sizeof(*ranges))) {
+ debug("%s: dma-ranges too short for %s\n", __func__,
+ fdt_get_name(blob, node, NULL));
+ ret = -EINVAL;
+ goto out;
+ }
+
*bus = fdt_read_number(ranges, na);
*cpu = fdt_translate_dma_address(blob, node, ranges + na);
*size = fdt_read_number(ranges + na + pna, ns);