From a221c289a384df5d0f1af232b75c8a539c502e9a Mon Sep 17 00:00:00 2001 From: CleverMouse Date: Mon, 17 Dec 2012 15:54:19 +0000 Subject: [PATCH] fix double-unlock in free(); make free() always save edi; update test git-svn-id: svn://kolibrios.org@3126 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/malloc.inc | 19 ++++++------------- kernel/trunk/core/test_malloc.asm | 29 ++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/kernel/trunk/core/malloc.inc b/kernel/trunk/core/malloc.inc index ec4612c231..7a1939699d 100644 --- a/kernel/trunk/core/malloc.inc +++ b/kernel/trunk/core/malloc.inc @@ -341,10 +341,9 @@ free: ; insert_chunk(p,psize); mov eax, esi - pop esi mov ecx, edi - pop edi - jmp insert_chunk + call insert_chunk + jmp .fail2 .unl_large: ; unlink_large_chunk((tchunkptr)next); @@ -364,10 +363,9 @@ free: ; insert_chunk(p,psize); mov eax, esi - pop esi mov ecx, edi - pop edi - jmp insert_chunk + call insert_chunk + jmp .fail2 .fix_next: ; (p+psize)->prev_foot = psize; @@ -386,10 +384,9 @@ free: ; insert_chunk(p,psize); mov eax, esi - pop esi mov ecx, edi - pop edi - jmp insert_chunk + call insert_chunk + jmp .fail2 ; param ; ecx = chunk @@ -418,15 +415,11 @@ insert_chunk: mov [esi+8], edx ;P->fd = F mov [esi+12], eax ;P->bk = B pop esi - mov ecx, mst.mutex - call mutex_unlock ret .large: mov ebx, eax call insert_large_chunk pop esi - mov ecx, mst.mutex - call mutex_unlock ret diff --git a/kernel/trunk/core/test_malloc.asm b/kernel/trunk/core/test_malloc.asm index 7d1b091ae4..c60174394f 100644 --- a/kernel/trunk/core/test_malloc.asm +++ b/kernel/trunk/core/test_malloc.asm @@ -50,12 +50,12 @@ run_test2: ret run_test3: -; 1024000 times run random operation. +; 1024 times run random operation. ; Randomly select malloc(random size from 1 to 1023) ; or free(random of previously allocated areas) mov edi, 0x12345678 xor esi, esi ; 0 areas allocated - mov ebx, 1024000 + mov ebx, 1024 .loop: imul edi, 1103515245 add edi, 12345 @@ -78,7 +78,11 @@ run_test3: push eax ; mov ecx, [saved_state_num] ; mov [saved_state+ecx*8], eax + push edi call malloc_with_test + pop ecx + cmp ecx, edi + jnz edi_destroyed ; mov ecx, [saved_state_num] ; mov [saved_state+ecx*8+4], eax ; inc [saved_state_num] @@ -113,7 +117,11 @@ run_test3: jnz memory_destroyed pop eax edi push ebx edx + push edi call free + pop ecx + cmp ecx, edi + jnz edi_destroyed pop edx ebx dec esi pop eax ecx @@ -150,8 +158,14 @@ malloc_with_test: ret ; Stubs for kernel procedures used by heap code -wait_mutex: - inc dword [ebx] +mutex_init: + and dword [ecx], 0 + ret +mutex_lock: + inc dword [ecx] + ret +mutex_unlock: + dec dword [ecx] ret kernel_alloc: @@ -174,7 +188,7 @@ generic_malloc_fail: jmp error_with_code check_mutex: - cmp [mst.mutex], 0 + cmp dword [mst.mutex], 0 jnz @f ret @@: @@ -195,6 +209,10 @@ memory_destroyed: mov eax, 5 jmp error_with_code +edi_destroyed: + mov eax, 6 + jmp error_with_code + error_with_code: mov edx, saved_state_num ; eax = error code @@ -208,6 +226,7 @@ error_with_code: ; Include main heap code include '../proc32.inc' +include '../struct.inc' include '../const.inc' include 'malloc.inc'