Skip to content

Potential thread stack overflow in SystemTask::Process #2407

@k6dpvrmm8z-glitch

Description

@k6dpvrmm8z-glitch

Issue details

While some detailed build configuration, There are potential stack overflow in thread function named SystemTask::Process

if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 1, &taskHandle)) {

In this line, SystemTask::Process Allows 1400(350*4) stack size.

However, after checking the stack using our internally developed tool, it might have 1432 Bytes in with some detailed configurations.

Steps to produce

1. In CMakeLists.txt , Add this line:

add_compile_options(
    $<$<COMPILE_LANGUAGE:C>:-fstack-usage>
    $<$<COMPILE_LANGUAGE:CXX>:-fstack-usage>
)

This will help you automatically calculating stack size of each function.

2. Build InfiniTime normally, using this configurations:

make pinetime-app

Now we can get stack usage file (*.su) for each source file, So we can manually check stack size of each function.

In case of SystemTask::Process :

There are large call stack with this flow:

Pinetime::System::SystemTask::Process (_ZN8Pinetime6System10SystemTask7ProcessEPv) => 8 bytes
Pinetime::System::SystemTask::Work (_ZN8Pinetime6System10SystemTask4WorkEv) => 64 bytes
Pinetime::Controllers::NimbleController::Init(_ZN8Pinetime11Controllers16NimbleController4InitEv) => 24 bytes
Pinetime::Controllers::NimbleController::RestoreBond(_ZN8Pinetime11Controllers16NimbleController11RestoreBondEv) => 272 bytes
Pinetime::Controllers::FS::FileDelete(_ZN8Pinetime11Controllers2FS10FileDeleteEPKc) => 0 bytes
lfs_remove(lfs_remove) => 120 bytes
lfs_fs_forceconsistency(lfs_fs_forceconsistency) => 144 bytes
lfs_dir_drop(lfs_dir_drop) => 24 bytes
lfs_dir_commit(lfs_dir_commit) => 168 bytes
lfs_dir_compact(lfs_dir_compact) => 160 bytes
lfs_dir_split(lfs_dir_split) => 88 bytes
lfs_dir_alloc(lfs_dir_alloc) => 32 bytes
lfs_alloc(lfs_alloc) => 24 bytes
lfs_fs_rawtraverse(lfs_fs_rawtraverse) => 104 bytes
lfs_dir_fetch(lfs_dir_fetch) => 24 bytes
lfs_dir_fetchmatch(lfs_dir_fetchmatch) => 112 bytes
lfs_bd_read(lfs_bd_read) => 64 bytes

SUM => 1432 bytes
So, there are potentially occur stack overflow in SystemTask::Process Thread function.

Environment

Version
Commit 7128fc0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions