InfiniTimeOrg / InfiniTimeOrg/InfiniTime

Potential thread stack overflow in SystemTask::Process

Open
#2,407 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C
Stars
3.4k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

Issue details

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

https://github.com/InfiniTimeOrg/InfiniTime/blob/0fabfe99d9115c5e258a14fd0c985d300ee41f2d/src/systemtask/SystemTask.cpp#L90

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 https://github.com/InfiniTimeOrg/InfiniTime/commit/7128fc045db083c7014166872b50b536942c06e0

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with src/systemtask/SystemTask.cpp at the linked SystemTask::Process location and the CMakeLists.txt stack-usage options. Build with make pinetime-app, inspect the generated .su files, and trace the reported Process-to-littlefs call path. Done means determining whether the 1432-byte path exceeds the thread stack and addressing or documenting the result.

Written by the indexing model from the issue text.

Assessment

Tech stack
cmake, cpp
Domain
embedded-iot, operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.