From 2aaa991a503dc28b087d81b59531c66931ad74d8 Mon Sep 17 00:00:00 2001 From: Tomas Vanek Date: Sat, 30 Jul 2022 12:15:43 +0200 Subject: [PATCH] target: fix unaligned return of target_get_working_area_avail() The working area allocation routines use 4 byte word alignment. In the corner case the size of the working area is not aligned, target_alloc_working_area() of size = target_get_working_area_avail() will fail because the size gets aligned up and does not fit to the area which size is aligned down. Align down the result of target_get_working_area_avail() to cope with that corner case. While on it use fancy ALIGN_... macros instead of bitwise and operator. Change-Id: Ia2a1e861c401c2c78fe6323379a3776fb4f47b06 Signed-off-by: Tomas Vanek Reviewed-on: https://review.openocd.org/c/openocd/+/7096 Tested-by: jenkins Reviewed-by: Erhan Kurubas Reviewed-by: Antonio Borneo --- src/target/target.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/target/target.c b/src/target/target.c index 78073f680..553400df6 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -2071,7 +2071,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w struct working_area *new_wa = malloc(sizeof(*new_wa)); if (new_wa) { new_wa->next = NULL; - new_wa->size = target->working_area_size & ~3UL; /* 4-byte align */ + new_wa->size = ALIGN_DOWN(target->working_area_size, 4); /* 4-byte align */ new_wa->address = target->working_area; new_wa->backup = NULL; new_wa->user = NULL; @@ -2082,8 +2082,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w } /* only allocate multiples of 4 byte */ - if (size % 4) - size = (size + 3) & (~3UL); + size = ALIGN_UP(size, 4); struct working_area *c = target->working_areas; @@ -2237,7 +2236,7 @@ uint32_t target_get_working_area_avail(struct target *target) uint32_t max_size = 0; if (!c) - return target->working_area_size; + return ALIGN_DOWN(target->working_area_size, 4); while (c) { if (c->free && max_size < c->size)