diff mbox series

device.c: Fix pdbg_target_address

Message ID 20181109012020.3176-1-alistair@popple.id.au
State Accepted
Headers show
Series device.c: Fix pdbg_target_address | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success master/apply_patch Successfully applied
snowpatch_ozlabs/build-multiarch success Test build-multiarch on branch master

Commit Message

Alistair Popple Nov. 9, 2018, 1:20 a.m. UTC
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@popple.id.au>
---
 libpdbg/device.c                |  9 ++++-----
 src/tests/libpdbg_target_test.c | 10 +++++++++-
 2 files changed, 13 insertions(+), 6 deletions(-)
diff mbox series

Patch

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) {