[Pdbg] [PATCH] device.c: Fix pdbg_target_address
Alistair Popple
alistair at popple.id.au
Fri Nov 9 12:20:20 AEDT 2018
Commit 936dbdcedb27 ("libpdbg: Rework target addressing") introduced a
bug leading to the following assertion failing:
pdbg: libpdbg/device.c:634: pdbg_target_address: Assertion `(pos + n) <= p->len' failed.
When this function was reworked the index parameter was dropped as
every caller set index == 0. Removal should have also resulted in the
local pos variable being removed. Instead it was set as if index == 1
resulting in the above violation.
Fix the bug and add a test to check pdbg_target_address().
Signed-off-by: Alistair Popple <alistair at popple.id.au>
---
libpdbg/device.c | 9 ++++-----
src/tests/libpdbg_target_test.c | 10 +++++++++-
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/libpdbg/device.c b/libpdbg/device.c
index 9557172..f81b1b5 100644
--- a/libpdbg/device.c
+++ b/libpdbg/device.c
@@ -626,15 +626,14 @@ uint64_t pdbg_target_address(struct pdbg_target *target, uint64_t *out_size)
const struct dt_property *p;
u32 na = dt_n_address_cells(target);
u32 ns = dt_n_size_cells(target);
- u32 pos, n;
+ u32 n;
p = dt_require_property(target, "reg", -1);
n = (na + ns) * sizeof(u32);
- pos = n;
- assert((pos + n) <= p->len);
+ assert(n <= p->len);
if (out_size)
- *out_size = dt_get_number(p->prop + pos + na * sizeof(u32), ns);
- return dt_get_number(p->prop + pos, na);
+ *out_size = dt_get_number(p->prop + na * sizeof(u32), ns);
+ return dt_get_number(p->prop, na);
}
void pdbg_targets_init(void *fdt)
diff --git a/src/tests/libpdbg_target_test.c b/src/tests/libpdbg_target_test.c
index 6b64326..eb5e0f4 100644
--- a/src/tests/libpdbg_target_test.c
+++ b/src/tests/libpdbg_target_test.c
@@ -63,7 +63,7 @@ int main(void)
{
struct pdbg_target *root, *target, *parent, *parent2;
const char *name;
- int count;
+ int count, i;
pdbg_targets_init(&_binary_fake_dtb_o_start);
@@ -161,7 +161,10 @@ int main(void)
assert(!strncmp(name, "pib", 3));
}
+ i = 0;
pdbg_for_each_class_target("core", target) {
+ uint64_t addr, size;
+
parent = pdbg_target_parent("fsi", target);
assert(parent);
@@ -203,6 +206,11 @@ int main(void)
name = pdbg_target_dn_name(target);
assert(!strncmp(name, "core", 4));
+
+ addr = pdbg_target_address(target, &size);
+ assert(size == 0);
+ assert(addr == 0x10000 + (i / 4)*0x1000 + ((i % 4) + 1)*0x10);
+ i++;
}
pdbg_for_each_class_target("thread", target) {
--
2.11.0
More information about the Pdbg
mailing list