This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/7096

-- gerrit

commit b27ac741351bf6ea50c9473e18738f13d4fda3f0
Author: Tomas Vanek <van...@fbl.cz>
Date:   Sat Jul 30 12:15:43 2022 +0200

    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 <van...@fbl.cz>

diff --git a/src/target/target.c b/src/target/target.c
index 78073f6807..553400df68 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)

-- 

Reply via email to