eclipse-threadx / threadx

Eclipse ThreadX is an advanced real-time operating system (RTOS) designed specifically for deeply embedded applications.
https://github.com/eclipse-threadx/rtos-docs/blob/main/rtos-docs/threadx/index.md
MIT License
2.87k stars 782 forks source link

Threadx modules kernel stack memory leakage #400

Open amgross opened 1 month ago

amgross commented 1 month ago

Describe the bug tx_thread_module_kernel_stack_start is allocated at _txm_module_manager_thread_create from the object pool, but is not released at thread delete function (it is deleted upon module stop when all objects of the module are deleted)

To Reproduce Run from module:

    while(1)
    {
        status = txm_module_object_allocate(<thread_ptr>, sizeof(TX_THREAD));
        assert(TX_SUCCESS == status);

        status = tx_thread_create(<thread_ptr>, "my thread", <my_thread_func>, 0, <stack_ptr>,
                <stack size>, <priority>, <priority>, <time slice>, TX_DONT_START);
        assert(TX_SUCCESS == status);

        status = tx_thread_terminate(<thread_ptr>);
        assert(TX_SUCCESS == status);

        // This system call deallocating also <thread_ptr>, so will need to allocate it afterward
        tx_thread_delete(<thread_ptr>);
        assert(TX_SUCCESS == status);
    }

Expected behavior tx_thread_module_kernel_stack_start should be released upon thread delete.

Impact Can leak object pool out of memory, which cause no more option to create OS objects from module

Logs and console output

Additional context

amgross commented 1 month ago

Workaround: add to tx_port.h (or tx_user.h)

extern UINT  _txm_module_manager_object_deallocate(VOID *object_ptr);
#define TX_THREAD_DELETE_PORT_COMPLETION(t) _txm_module_manager_object_deallocate(t -> tx_thread_module_kernel_stack_start);