This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit aead1981a71ebbd368baa3e67b9e1e1469580d45
Author: wangmingrong1 <wangmingro...@xiaomi.com>
AuthorDate: Thu Jun 19 15:56:18 2025 +0800

    kasan: Potential recursive registration shadow area error
    
    When initializing a memory block, the shadow area record of the first
    memory block is used first.When uninitializing, unpoison is required, 
otherwise the memory will be marked incorrectly.
    The following case will cause problems:
        void *mem = malloc(1024);
        struct mm_heap_s *a = mm_initialize("hello", mem, 1024);
        int *b = mm_malloc(a, sizeof(int *));
        *b = 100;
        printf("Hello, World!! %d\n", *b);
        mm_free(a, b);
        mm_uninitialize(a);
        free(mem);
    
    Signed-off-by: wangmingrong1 <wangmingro...@xiaomi.com>
---
 mm/kasan/generic.c | 5 ++++-
 mm/kasan/sw_tags.c | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c
index 1a736d28be..dfd62a61f5 100644
--- a/mm/kasan/generic.c
+++ b/mm/kasan/generic.c
@@ -268,10 +268,13 @@ void kasan_unregister(FAR void *addr)
     {
       if (g_region[i]->begin == (uintptr_t)addr)
         {
+          size_t size = g_region[i]->end - g_region[i]->begin;
           g_region_count--;
           memmove(&g_region[i], &g_region[i + 1],
                   (g_region_count - i) * sizeof(g_region[0]));
-          break;
+          spin_unlock_irqrestore(&g_lock, flags);
+          kasan_unpoison(addr, size);
+          return;
         }
     }
 
diff --git a/mm/kasan/sw_tags.c b/mm/kasan/sw_tags.c
index 8bfaa821a4..2df66485c1 100644
--- a/mm/kasan/sw_tags.c
+++ b/mm/kasan/sw_tags.c
@@ -217,10 +217,13 @@ void kasan_unregister(FAR void *addr)
     {
       if (g_region[i]->begin == (uintptr_t)addr)
         {
+          size_t size = g_region[i]->end - g_region[i]->begin;
           g_region_count--;
           memmove(&g_region[i], &g_region[i + 1],
                   (g_region_count - i) * sizeof(g_region[0]));
-          break;
+          spin_unlock_irqrestore(&g_lock, flags);
+          kasan_unpoison(addr, size);
+          return;
         }
     }
 

Reply via email to