summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-07-07 01:12:18 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-07-07 01:12:18 +0000
commit2b3730d9d0c864b6da20b8c8bb77943f704d050e (patch)
tree4d146b70e81e196e072bcb73f882b8a942f30c75
parentca7ff7dbd03d46118ebed5ee2c4e9e041a0d92c8 (diff)
parentf80bca6977750793d7ac884a9b57a1bfa93e0ec7 (diff)
downloadlibufdt-android14-mainline-tethering-release.tar.gz
Change-Id: Id6cc377ab4281ea8fd0f0da998f66280e60ef7ae
-rw-r--r--Android.bp17
-rw-r--r--sysdeps/include/libufdt_sysdeps.h10
-rw-r--r--tests/src/Android.bp10
-rw-r--r--tests/src/extract_dtb.c55
-rw-r--r--tests/src/fdt_overlay_test_app.c9
-rw-r--r--tests/src/ufdt_overlay_test_app.c9
-rw-r--r--tests/src/ufdt_verify_overlay_app.cpp6
-rwxr-xr-xtests/verifyDTBO.sh10
-rw-r--r--ufdt_convert.c52
-rw-r--r--ufdt_node.c16
-rw-r--r--ufdt_overlay.c18
-rw-r--r--ufdt_prop_dict.c7
-rw-r--r--utils/src/Android.bp9
-rwxr-xr-xutils/src/mkdtboimg.py2
-rw-r--r--utils/src/mkdtimg_dump.c29
15 files changed, 183 insertions, 76 deletions
diff --git a/Android.bp b/Android.bp
index e0fb5d9..5c70abf 100644
--- a/Android.bp
+++ b/Android.bp
@@ -47,8 +47,8 @@ subdirs = [
"tests/libufdt_verify",
]
-cc_library_static {
- name: "libufdt",
+cc_defaults {
+ name: "libufdt_defaults",
host_supported: true,
srcs: [
"ufdt_overlay.c",
@@ -64,3 +64,16 @@ cc_library_static {
"libufdt_sysdeps",
],
}
+
+cc_library_static {
+ name: "libufdt",
+ defaults: [ "libufdt_defaults" ],
+}
+
+// Same library but without error messages.
+cc_library_static {
+ name: "libufdt_silent",
+ defaults: [ "libufdt_defaults" ],
+ cflags: ["-Wall", "-Werror", "-DDTO_DISABLE_ERROR_MSG"],
+}
+
diff --git a/sysdeps/include/libufdt_sysdeps.h b/sysdeps/include/libufdt_sysdeps.h
index 1e1ea6d..f337b1a 100644
--- a/sysdeps/include/libufdt_sysdeps.h
+++ b/sysdeps/include/libufdt_sysdeps.h
@@ -38,14 +38,22 @@
dto_print(__VA_ARGS__); \
} while (0)
#else
-#define dto_debug(...)
+#define dto_debug(...) \
+ do { \
+ } while (0)
#endif
+#ifndef DTO_DISABLE_ERROR_MSG
#define dto_error(...) \
do { \
dto_print("ERROR: %s():", __func__); \
dto_print(__VA_ARGS__); \
} while (0)
+#else
+#define dto_error(...) \
+ do { \
+ } while (0)
+#endif
int dto_print(const char *fmt, ...);
diff --git a/tests/src/Android.bp b/tests/src/Android.bp
index 10ba099..3c4dc04 100644
--- a/tests/src/Android.bp
+++ b/tests/src/Android.bp
@@ -79,6 +79,7 @@ cc_binary_host {
cc_binary {
name: "fdt_apply_overlay",
+ host_supported: true,
cflags: libufdt_tests_cflags,
srcs: [
"fdt_overlay_test_app.c",
@@ -89,6 +90,15 @@ cc_binary {
"libufdt_sysdeps",
],
required: ["dtc"],
+ target: {
+ host: {
+ stl: "none",
+ dist: {
+ targets: ["dist_files"],
+ dir: "libufdt",
+ },
+ },
+ },
}
cc_binary_host {
diff --git a/tests/src/extract_dtb.c b/tests/src/extract_dtb.c
index 8d74324..3e14618 100644
--- a/tests/src/extract_dtb.c
+++ b/tests/src/extract_dtb.c
@@ -22,8 +22,7 @@
#include "util.h"
-
-int find_dtb_header_pos(const char *buf, size_t buf_size) {
+static int find_dtb_header_pos(const char *buf, size_t buf_size) {
if (buf == NULL || buf_size == 0) {
return -1;
}
@@ -44,34 +43,44 @@ int find_dtb_header_pos(const char *buf, size_t buf_size) {
return pos;
}
-int find_and_write_dtb(const char *filename,
- const char *buf, size_t buf_size) {
+static int find_and_write_dtb(const char *filename, const char *buf,
+ size_t buf_size) {
int tag_pos = find_dtb_header_pos(buf, buf_size);
if (tag_pos < 0) {
- goto end;
+ return -1;
}
+ buf_size -= tag_pos;
+
+ // Allocate and copy into new buffer to fix memory alignment
+ char *fdt_ptr = malloc(buf_size);
+ if (!fdt_ptr) {
+ fprintf(stderr, "malloc(%u) failed.\n", buf_size - tag_pos);
+ goto error;
+ }
+
+ memcpy(fdt_ptr, buf + tag_pos, buf_size);
+
// Check FDT header
- const char *fdt_ptr = buf + tag_pos;
- if (fdt_check_header(fdt_ptr) != 0) {
- fprintf(stderr, "Bad DTB header.\n");
- goto end;
+ if (fdt_check_full(fdt_ptr, buf_size) != 0) {
+ fprintf(stderr, "Bad DTB.\n");
+ goto error;
}
// Check FDT size and actual size
size_t fdt_size = fdt_totalsize(fdt_ptr);
- size_t fdt_actual_size = buf_size - tag_pos;
- int fdt_size_diff = (int)fdt_actual_size - (int)fdt_size;
- if (fdt_size_diff) {
- fprintf(stderr, "Wrong size: actual size = %d FDT size = %d(%d)\n",
- fdt_actual_size, fdt_size, fdt_size_diff);
+ if (buf_size < fdt_size) {
+ fprintf(stderr,
+ "Wrong size: fdt truncated: buffer size = %zu < FDT size = %zu\n",
+ buf_size, fdt_size);
+ goto error;
}
// Print the DT basic information
int root_node_off = fdt_path_offset(fdt_ptr, "/");
if (root_node_off < 0) {
fprintf(stderr, "Can not get the root node.\n");
- goto end;
+ goto error;
}
printf("Output %s\n", filename);
const char *model =
@@ -84,22 +93,26 @@ int find_and_write_dtb(const char *filename,
// Output DTB file
if (write_fdt_to_file(filename, fdt_ptr) != 0) {
fprintf(stderr, "Write file error: %s\n", filename);
- goto end;
+ goto error;
}
-end:
+ free(fdt_ptr);
+
return tag_pos;
+
+error:
+ if (fdt_ptr) free(fdt_ptr);
+ return -1;
}
-int extract_dtbs(const char *in_filename,
- const char *out_dtb_filename,
- const char *out_image_filename) {
+static int extract_dtbs(const char *in_filename, const char *out_dtb_filename,
+ const char *out_image_filename) {
int ret = 1;
char *buf = NULL;
size_t buf_size;
buf = load_file(in_filename, &buf_size);
- if (!buf) {
+ if (!buf || fdt_check_full(buf, buf_size)) {
fprintf(stderr, "Can not load file: %s\n", in_filename);
goto end;
}
diff --git a/tests/src/fdt_overlay_test_app.c b/tests/src/fdt_overlay_test_app.c
index 3b65a7d..04fcdd9 100644
--- a/tests/src/fdt_overlay_test_app.c
+++ b/tests/src/fdt_overlay_test_app.c
@@ -31,20 +31,25 @@ int apply_overlay_files(const char *out_filename, const char *base_filename,
size_t base_len;
base_buf = load_file(base_filename, &base_len);
- if (!base_buf) {
+ if (!base_buf || fdt_check_full(base_buf, base_len)) {
fprintf(stderr, "Can not load base file: %s\n", base_filename);
goto end;
}
size_t overlay_len;
overlay_buf = load_file(overlay_filename, &overlay_len);
- if (!overlay_buf) {
+ if (!overlay_buf || fdt_check_full(overlay_buf, overlay_len)) {
fprintf(stderr, "Can not load overlay file: %s\n", overlay_filename);
goto end;
}
size_t merged_buf_len = base_len + overlay_len;
merged_buf = dto_malloc(merged_buf_len);
+ if (!merged_buf) {
+ fprintf(stderr, "Malloc failed: %zu bytes needed\n", merged_buf_len);
+ goto end;
+ }
+
fdt_open_into(base_buf, merged_buf, merged_buf_len);
clock_t start = clock();
diff --git a/tests/src/ufdt_overlay_test_app.c b/tests/src/ufdt_overlay_test_app.c
index d7c4437..9d47476 100644
--- a/tests/src/ufdt_overlay_test_app.c
+++ b/tests/src/ufdt_overlay_test_app.c
@@ -32,14 +32,14 @@ int apply_overlay_files(const char *out_filename, const char *base_filename,
size_t blob_len;
base_buf = load_file(base_filename, &blob_len);
- if (!base_buf) {
+ if (!base_buf || fdt_check_full(base_buf, blob_len)) {
fprintf(stderr, "Can not load base file: %s\n", base_filename);
goto end;
}
size_t overlay_len;
overlay_buf = load_file(overlay_filename, &overlay_len);
- if (!overlay_buf) {
+ if (!overlay_buf || fdt_check_full(overlay_buf, overlay_len)) {
fprintf(stderr, "Can not load overlay file: %s\n", overlay_filename);
goto end;
}
@@ -54,6 +54,11 @@ int apply_overlay_files(const char *out_filename, const char *base_filename,
new_blob = ufdt_apply_overlay(blob, blob_len, overlay_buf, overlay_len);
clock_t end = clock();
+ if (!new_blob) {
+ fprintf(stderr, "ufdt_apply_overlay() returned null: bad input?\n");
+ goto end;
+ }
+
if (write_fdt_to_file(out_filename, new_blob) != 0) {
fprintf(stderr, "Write file error: %s\n", out_filename);
goto end;
diff --git a/tests/src/ufdt_verify_overlay_app.cpp b/tests/src/ufdt_verify_overlay_app.cpp
index ff48c1a..7b66f9b 100644
--- a/tests/src/ufdt_verify_overlay_app.cpp
+++ b/tests/src/ufdt_verify_overlay_app.cpp
@@ -98,11 +98,7 @@ int main(int argc, char **argv) {
}
const char *final_file = argv[1];
- char** overlay_file_names = new char*[argc - 2];
-
- for(int argv_idx = 2; argv_idx < argc; argv_idx++) {
- overlay_file_names[argv_idx - 2] = argv[argv_idx];
- }
+ char **overlay_file_names = &argv[2];
int ret = verify_overlay_files(final_file, overlay_file_names, argc - 2);
return ret == 0 ? ret : 1;
diff --git a/tests/verifyDTBO.sh b/tests/verifyDTBO.sh
index d1a4366..7c3dbfd 100755
--- a/tests/verifyDTBO.sh
+++ b/tests/verifyDTBO.sh
@@ -24,11 +24,15 @@ adb pull $dtbo_path dtbo.img > /dev/null
adb pull /sys/firmware/fdt final_dt > /dev/null
#decompile the DTBO image
-mkdtimg_path="${ANDROID_HOST_BIN_LOCATION}/mkdtboimg.py"
+mkdtimg_path="${ANDROID_HOST_BIN_LOCATION}/mkdtboimg"
$mkdtimg_path dump dtbo.img -b dumped_dtbo > /dev/null
-#Get the index of the overlay applied from the kernel command line
-overlay_idx=$(adb shell cat /proc/cmdline | grep -o "androidboot.dtbo_idx=[^ ]*" | cut -d "=" -f 2)
+#Get the index of the overlay applied. Try bootconfig first, then cmdline.
+overlay_idx=$(adb shell cat /proc/bootconfig \
+ | grep 'androidboot.dtbo_idx = .*$' | cut -d "=" -f 2 | sed 's/[ \\\"]//g')
+if [[ ! $overlay_idx =~ [0-9]+ ]]; then
+ overlay_idx=$(adb shell cat /proc/cmdline | grep -o "androidboot.dtbo_idx=[^ ]*" | cut -d "=" -f 2)
+fi
arg=""
for idx in ${overlay_idx//,/ }
do
diff --git a/ufdt_convert.c b/ufdt_convert.c
index 5c69f1f..8147f5b 100644
--- a/ufdt_convert.c
+++ b/ufdt_convert.c
@@ -40,6 +40,8 @@ struct ufdt *ufdt_construct(void *fdtp, struct ufdt_node_pool *pool) {
res_ufdt->mem_size_fdtps = DEFAULT_MEM_SIZE_FDTPS;
res_ufdt->num_used_fdtps = (fdtp != NULL ? 1 : 0);
res_ufdt->root = NULL;
+ res_ufdt->phandle_table.data = NULL;
+ res_ufdt->phandle_table.len = 0;
return res_ufdt;
@@ -149,7 +151,13 @@ static struct ufdt_node *fdt_to_ufdt_tree(void *fdtp, int cur_fdt_tag_offset,
do {
cur_fdt_tag_offset = *next_fdt_tag_offset;
+
tag = fdt_next_tag(fdtp, cur_fdt_tag_offset, next_fdt_tag_offset);
+ if (tag == FDT_END) {
+ dto_error("failed to get next tag\n");
+ break;
+ }
+
child_node = fdt_to_ufdt_tree(fdtp, cur_fdt_tag_offset,
next_fdt_tag_offset, tag, pool);
ufdt_node_add_child(res, child_node);
@@ -196,13 +204,21 @@ struct ufdt_node *ufdt_get_node_by_path_len(struct ufdt *tree, const char *path,
const char *alias_path =
ufdt_node_get_fdt_prop_data(aliases_node, &path_len);
- if (alias_path == NULL) {
- dto_error("Failed to find alias %s\n", path);
+ if (alias_path == NULL || path_len == 0) {
+ dto_error("Failed to find valid alias %s\n", path);
+ return NULL;
+ }
+
+ /* property data must be a nul terminated string */
+ int alias_len = strnlen(alias_path, path_len);
+
+ if (alias_len != path_len - 1 || alias_len == 0) {
+ dto_error("Invalid alias for %s\n", path);
return NULL;
}
struct ufdt_node *target_node =
- ufdt_node_get_node_by_path_len(tree->root, alias_path, path_len);
+ ufdt_node_get_node_by_path_len(tree->root, alias_path, alias_len);
return ufdt_node_get_node_by_path_len(target_node, next_slash,
end - next_slash);
@@ -250,14 +266,14 @@ static void set_phandle_table_entry(struct ufdt_node *node,
struct ufdt_phandle_table_entry *data,
int *cur) {
if (node == NULL || ufdt_node_tag(node) != FDT_BEGIN_NODE) return;
- int ph = ufdt_node_get_phandle(node);
+ uint32_t ph = ufdt_node_get_phandle(node);
if (ph > 0) {
data[*cur].phandle = ph;
data[*cur].node = node;
(*cur)++;
}
struct ufdt_node **it;
- for_each_node(it, node) set_phandle_table_entry(*it, data, cur);
+ for_each_child(it, node) set_phandle_table_entry(*it, data, cur);
return;
}
@@ -292,9 +308,16 @@ struct ufdt *ufdt_from_fdt(void *fdtp, size_t fdt_size,
return ufdt_construct(NULL, pool);
}
- struct ufdt *res_tree = ufdt_construct(fdtp, pool);
int end_offset;
int start_tag = fdt_next_tag(fdtp, start_offset, &end_offset);
+
+ if (start_tag != FDT_BEGIN_NODE) {
+ return ufdt_construct(NULL, pool);
+ }
+
+ struct ufdt *res_tree = ufdt_construct(fdtp, pool);
+ if (res_tree == NULL) return NULL;
+
res_tree->root =
fdt_to_ufdt_tree(fdtp, start_offset, &end_offset, start_tag, pool);
@@ -329,10 +352,16 @@ static int _ufdt_output_property_to_fdt(
int data_len = 0;
void *data = ufdt_node_get_fdt_prop_data(&prop_node->parent, &data_len);
- int aligned_data_len = (data_len + (FDT_TAGSIZE - 1)) & ~(FDT_TAGSIZE - 1);
+ if (!data) {
+ dto_error("Failed to get property data.\n");
+ return -1;
+ }
- int new_propoff = fdt_size_dt_struct(fdtp);
- int new_prop_size = sizeof(struct fdt_property) + aligned_data_len;
+ unsigned int aligned_data_len =
+ ((unsigned int)data_len + (FDT_TAGSIZE - 1u)) & ~(FDT_TAGSIZE - 1u);
+
+ unsigned int new_propoff = fdt_size_dt_struct(fdtp);
+ unsigned int new_prop_size = sizeof(struct fdt_property) + aligned_data_len;
struct fdt_property *new_prop =
(struct fdt_property *)((char *)fdtp + fdt_off_dt_struct(fdtp) +
new_propoff);
@@ -415,6 +444,7 @@ static int _ufdt_output_strtab_to_fdt(const struct ufdt *tree, void *fdt) {
int ufdt_to_fdt(const struct ufdt *tree, void *buf, int buf_size) {
if (tree->num_used_fdtps == 0) return -1;
+ if (tree->root == NULL) return -1;
int err;
err = fdt_create(buf, buf_size);
@@ -440,10 +470,12 @@ int ufdt_to_fdt(const struct ufdt *tree, void *buf, int buf_size) {
if (err < 0) return -1;
err = _ufdt_output_node_to_fdt(tree, buf, tree->root, &dict);
- if (err < 0) return -1;
+ // Ensure property_dict is freed, even on error path.
ufdt_prop_dict_destruct(&dict);
+ if (err < 0) return -1;
+
err = fdt_finish(buf);
if (err < 0) return -1;
diff --git a/ufdt_node.c b/ufdt_node.c
index 309c674..3568ad7 100644
--- a/ufdt_node.c
+++ b/ufdt_node.c
@@ -29,6 +29,14 @@ struct ufdt_node *ufdt_node_construct(void *fdtp, fdt32_t *fdt_tag_ptr,
res->parent.fdt_tag_ptr = fdt_tag_ptr;
res->parent.sibling = NULL;
res->name = fdt_string(fdtp, fdt32_to_cpu(prop->nameoff));
+
+ /* fdt_string() may fail */
+ if (!res->name) {
+ dto_error("Failed to get property name\n");
+ ufdt_node_pool_free(pool, res);
+ res = NULL;
+ }
+
return (struct ufdt_node *)res;
} else {
struct ufdt_node_fdt_node *res = (struct ufdt_node_fdt_node *)buf;
@@ -118,7 +126,13 @@ char *ufdt_node_get_fdt_prop_data(const struct ufdt_node *node, int *out_len) {
}
const struct fdt_property *prop = (struct fdt_property *)node->fdt_tag_ptr;
if (out_len != NULL) {
- *out_len = fdt32_to_cpu(prop->len);
+ uint32_t prop_len = fdt32_to_cpu(prop->len);
+
+ if (prop_len > INT_MAX) {
+ return NULL;
+ }
+
+ *out_len = prop_len;
}
return (char *)prop->data;
}
diff --git a/ufdt_overlay.c b/ufdt_overlay.c
index c432cd4..69467a6 100644
--- a/ufdt_overlay.c
+++ b/ufdt_overlay.c
@@ -163,7 +163,12 @@ void *ufdt_get_fixup_location(struct ufdt *tree, const char *fixup) {
prop_offset = dto_strtoul(offset_ptr, &end_ptr, 10 /* base */);
if (*end_ptr != '\0') {
- dto_error("'%s' is not valid number\n", offset_ptr);
+ dto_error("'%s' is not a valid number\n", offset_ptr);
+ goto fail;
+ }
+
+ if (prop_offset < 0) {
+ dto_error("'%s' is not a valid offset\n", offset_ptr);
goto fail;
}
@@ -183,7 +188,8 @@ void *ufdt_get_fixup_location(struct ufdt *tree, const char *fixup) {
/*
* Note that prop_offset is the offset inside the property data.
*/
- if (prop_len < prop_offset + (int)sizeof(uint32_t)) {
+ if (prop_len < (int)sizeof(uint32_t) ||
+ prop_offset > prop_len - (int)sizeof(uint32_t)) {
dto_error("%s: property length is too small for fixup\n", path);
goto fail;
}
@@ -448,12 +454,14 @@ static int ufdt_local_fixup_prop(struct ufdt_node *target_prop_node,
int len = 0;
prop_offsets_ptr = ufdt_node_get_fdt_prop_data(local_fixup_prop_node, &len);
+ if (prop_offsets_ptr == NULL || len % sizeof(fdt32_t) != 0) return -1;
+
char *prop_data;
int target_length = 0;
prop_data = ufdt_node_get_fdt_prop_data(target_prop_node, &target_length);
- if (prop_offsets_ptr == NULL || prop_data == NULL) return -1;
+ if (prop_data == NULL) return -1;
int i;
for (i = 0; i < len; i += sizeof(fdt32_t)) {
@@ -609,11 +617,11 @@ struct fdt_header *ufdt_install_blob(void *blob, size_t blob_size) {
err = fdt_check_header(pHeader);
if (err < 0) {
if (err == -FDT_ERR_BADVERSION) {
- dto_error("incompatible blob version: %d, should be: %d",
+ dto_error("incompatible blob version: %d, should be: %d\n",
fdt_version(pHeader), FDT_LAST_SUPPORTED_VERSION);
} else {
- dto_error("error validating blob: %s", fdt_strerror(err));
+ dto_error("error validating blob: %s\n", fdt_strerror(err));
}
return NULL;
}
diff --git a/ufdt_prop_dict.c b/ufdt_prop_dict.c
index 2d412cd..fbd346a 100644
--- a/ufdt_prop_dict.c
+++ b/ufdt_prop_dict.c
@@ -29,14 +29,14 @@
#define DICT_LIMIT_DEN 3
static int _ufdt_prop_dict_str_hash(const char *str) {
- int res = 0;
+ unsigned int res = 0;
for (; *str != '\0'; str++) {
res *= HASH_BASE;
res += *str;
}
- return res;
+ return (int)res;
}
static const struct fdt_property **_ufdt_prop_dict_find_index_by_name(
@@ -52,7 +52,7 @@ static const struct fdt_property **_ufdt_prop_dict_find_index_by_name(
if (prop == NULL) return prop_ptr;
const char *prop_name = fdt_string(dict->fdtp, fdt32_to_cpu(prop->nameoff));
- if (dto_strcmp(prop_name, name) == 0) return prop_ptr;
+ if (prop_name != NULL && dto_strcmp(prop_name, name) == 0) return prop_ptr;
idx = (idx + 1) & (size - 1);
}
@@ -62,6 +62,7 @@ static const struct fdt_property **_ufdt_prop_dict_find_index_by_name(
static const struct fdt_property **_ufdt_prop_dict_find_index(
struct ufdt_prop_dict *dict, const struct fdt_property *prop) {
const char *name = fdt_string(dict->fdtp, fdt32_to_cpu(prop->nameoff));
+ if (name == NULL) return NULL;
return _ufdt_prop_dict_find_index_by_name(dict, name);
}
diff --git a/utils/src/Android.bp b/utils/src/Android.bp
index 997121b..bd79167 100644
--- a/utils/src/Android.bp
+++ b/utils/src/Android.bp
@@ -55,7 +55,7 @@ cc_binary_host {
//##################################################
python_binary_host {
- name: "mkdtboimg.py",
+ name: "mkdtboimg",
main: "mkdtboimg.py",
srcs: ["mkdtboimg.py"],
version: {
@@ -64,10 +64,3 @@ python_binary_host {
},
},
}
-
-//##################################################
-// TODO(b/153848038): Remove once we can use python binary as data for java_test_host
-filegroup {
- name: "mkdtboimg",
- srcs: ["mkdtboimg.py"],
-}
diff --git a/utils/src/mkdtboimg.py b/utils/src/mkdtboimg.py
index 5eeb5ea..2634c76 100755
--- a/utils/src/mkdtboimg.py
+++ b/utils/src/mkdtboimg.py
@@ -1018,7 +1018,7 @@ def print_usage(cmd, _):
def main():
"""Main entry point for mkdtboimg."""
- parser = argparse.ArgumentParser(prog='mkdtboimg.py')
+ parser = argparse.ArgumentParser()
subparser = parser.add_subparsers(title='subcommand',
description='Valid subcommands')
diff --git a/utils/src/mkdtimg_dump.c b/utils/src/mkdtimg_dump.c
index b28e3cf..14d4d5a 100644
--- a/utils/src/mkdtimg_dump.c
+++ b/utils/src/mkdtimg_dump.c
@@ -15,16 +15,15 @@
*/
#include <getopt.h>
+#include <inttypes.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-#include <stdint.h>
+#include "dt_table.h"
#include "libacpi.h"
#include "libfdt.h"
-#include "dt_table.h"
-
-
struct dump_params {
const char *img_filename;
const char *out_filename;
@@ -41,6 +40,10 @@ static void *read_fdt_from_image(FILE *img_fp,
void *fdt = NULL;
fdt = malloc(dt_size);
+ if (fdt == NULL) {
+ fprintf(stderr, "malloc(%" PRIu32 ") failed.\n", dt_size);
+ return NULL;
+ }
fseek(img_fp, dt_offset, SEEK_SET);
if (fread(fdt, dt_size, 1, img_fp) == 0) {
@@ -189,16 +192,18 @@ static int dump_image_from_fp(FILE *out_fp, FILE *img_fp,
uint32_t dt_offset = fdt32_to_cpu(entry.dt_offset);
if (dt_size > 0 && dt_offset > 0) {
void *fdt = read_fdt_from_image(img_fp, dt_offset, dt_size);
- output_fdt_info(out_fp, fdt, get_fdt_size);
+ if (fdt) {
+ output_fdt_info(out_fp, fdt, get_fdt_size);
- if (params->out_dtb_filename != NULL) {
- char filename[256];
- snprintf(filename, sizeof(filename), "%s.%d",
- params->out_dtb_filename, i);
- write_fdt_to_file(filename, fdt, get_fdt_size);
- }
+ if (params->out_dtb_filename != NULL) {
+ char filename[256];
+ snprintf(filename, sizeof(filename), "%s.%d",
+ params->out_dtb_filename, i);
+ write_fdt_to_file(filename, fdt, get_fdt_size);
+ }
- free_fdt(fdt);
+ free_fdt(fdt);
+ }
}
entry_offset += entry_size;