Skip to content

Bug: SIGABRT on destroy of active std::thread in MaintenanceManager #6443

@npoltorapavlo

Description

@npoltorapavlo

Problem/Opportunity

see documentaion of std,

~thread();
Thread destructor
Destroys the thread object.

If the thread is joinable when destroyed, terminate() is called.

crash:

Thread 11 "WorkerPool::Thr" received signal SIGABRT, Aborted.
[Switching to Thread 11801.11857]
__libc_do_syscall () at ../sysdeps/unix/sysv/linux/arm/libc-do-syscall.S:47
47	in ../sysdeps/unix/sysv/linux/arm/libc-do-syscall.S
(gdb) bt
#0  __libc_do_syscall () at ../sysdeps/unix/sysv/linux/arm/libc-do-syscall.S:47
#1  0xb3abe300 in __pthread_kill_implementation (threadid=<optimized out>, signo=6, no_tid=<optimized out>) at pthread_kill.c:43
#2  0xb3a8fbb6 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0xb3a815d4 in __GI_abort () at abort.c:79
#4  0xb3c32fac in __gnu_cxx::__verbose_terminate_handler () at ../../../../../../../../work-shared/gcc-11.3.0-r0/gcc-11.3.0/libstdc++-v3/libsupc++/vterminate.cc:95
#5  0xb3c31bdc in __cxxabiv1::__terminate (handler=<optimized out>)
    at ../../../../../../../../work-shared/gcc-11.3.0-r0/gcc-11.3.0/libstdc++-v3/libsupc++/eh_terminate.cc:48
#6  0xb3c31c3e in std::terminate () at ../../../../../../../../work-shared/gcc-11.3.0-r0/gcc-11.3.0/libstdc++-v3/libsupc++/eh_terminate.cc:58
#7  0xa955ec56 in std::thread::~thread (this=<optimized out>, __in_chrg=<optimized out>) at /usr/include/c++/11.3.0/bits/std_thread.h:152
#8  0xa95550dc in WPEFramework::Plugin::MaintenanceManager::~MaintenanceManager (this=this@entry=0x740688, __in_chrg=__in_chrg@entry=0, 
    __vtt_parm=0xa9583e38 <VTT for WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >+12>) at /usr/include/c++/11.3.0/ext/new_allocator.h:89
#9  0xa9555172 in WPEFramework::Plugin::MaintenanceManager::~MaintenanceManager (this=this@entry=0x740688, __vtt_parm=<optimized out>)
    at /usr/src/debug/rdkservices/3.0+gitAUTOINC+93fce14482-r1/git/MaintenanceManager/MaintenanceManager.cpp:1456
#10 0xa95693e0 in WPEFramework::Core::Service<WPEFramework::Plugin::MaintenanceManager>::~Service (this=this@entry=0x740688, __in_chrg=__in_chrg@entry=0, 
    __vtt_parm=0xa9583e34 <VTT for WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >+8>) at /usr/include/WPEFramework/core/Services.h:124
#11 0xa9569424 in WPEFramework::Core::Service<WPEFramework::Plugin::MaintenanceManager>::~Service (this=this@entry=0x740688, __vtt_parm=<optimized out>)
    at /usr/include/WPEFramework/core/Services.h:181
#12 0xa9569622 in WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager>::~PluginImplementation (this=this@entry=0x740688, __in_chrg=__in_chrg@entry=0, __vtt_parm=<optimized out>) at /usr/include/WPEFramework/plugins/MetaData.h:385
#13 0xa9569664 in WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager>::~PluginImplementation (this=this@entry=0x740688, __vtt_parm=<optimized out>) at /usr/include/WPEFramework/plugins/MetaData.h:385
#14 0xa956969a in WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >::~ProxyObject (this=this@entry=0x740688, __in_chrg=__in_chrg@entry=2, __vtt_parm=__vtt_parm@entry=0x0)
    at /usr/include/WPEFramework/core/Proxy.h:247
#15 0xa95696d0 in WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >::~ProxyObject (this=this@entry=0x740688) at /usr/include/WPEFramework/core/Proxy.h:108
#16 0xa95696fa in WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >::~ProxyObject (this=this@entry=0x740688) at /usr/include/WPEFramework/core/Proxy.h:119
#17 0xa9569746 in WPEFramework::Core::ProxyObject<WPEFramework::Plugin::Metadata<WPEFramework::Plugin::MaintenanceManager>::PluginImplementation<WPEFramework::Plugin::MaintenanceManager> >::Release (this=0x740688) at /usr/include/WPEFramework/core/Proxy.h:136
#18 0x00066bca in WPEFramework::PluginHost::Server::Service::ReleaseInterfaces (this=0x62ee58)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/PluginServer.h:2043
#19 0x0005f182 in WPEFramework::PluginHost::Server::Service::Deactivate (this=0x62ee58, why=<optimized out>)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/PluginServer.cpp:593
--Type <RET> for more, q to quit, c to continue without paging--c
#20 0x0003e324 in WPEFramework::Plugin::Controller::PutMethod (this=this@entry=0x7086a8, index=..., request=...)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/Controller.cpp:562
#21 0x0003f40e in WPEFramework::Plugin::Controller::Process (this=0x7086a8, request=...)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/Controller.cpp:220
#22 0x00064d20 in WPEFramework::PluginHost::Server::Service::Process (this=0x68e620, request=...)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/PluginServer.h:1430
#23 0x0007140e in WPEFramework::PluginHost::Server::Channel::Job::Process (message=..., this=0xb0961c40)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/core/../core/Proxy.h:541
#24 WPEFramework::PluginHost::Server::Channel::WebRequestJob::Dispatch (this=0xb0961c40)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/WPEFramework/PluginServer.h:3684
#25 0x00065c08 in WPEFramework::Core::ThreadPool::Minion::Process (this=this@entry=0x5b8ac8)
    at /usr/src/debug/wpeframework/4.4-r0/git/Source/core/../core/ThreadPool.h:452
#26 0x00065d66 in WPEFramework::Core::ThreadPool::Executor::Worker (this=0x5b89d8) at /usr/src/debug/wpeframework/4.4-r0/git/Source/core/../core/ThreadPool.h:540
#27 0xb3d0937c in WPEFramework::Core::Thread::StartThread (cClassPointer=0x5b89d8) at /usr/src/debug/wpeframework/4.4-r0/git/Source/core/Thread.cpp:194
#28 0xb3abcc86 in start_thread (arg=0x6642e226) at pthread_create.c:442
#29 0xb3b0d3c0 in ?? () at ../sysdeps/unix/sysv/linux/arm/clone.S:74 from /home/npoltorapavlo/Downloads/gdb/lib/libc.so.6

log:

2025-12-15T13:01:19.674Z MaintenanceManager[11801]:  INFO [MaintenanceManager.cpp:1492] Deinitialize: Timer Deleted on Deinitialization.
2025-12-15T13:01:19.675Z MaintenanceManager[11801]:  INFO [MaintenanceManager.cpp:2269] stopMaintenanceTasks: Request for stopMaintenance()
2025-12-15T13:01:19.675Z MaintenanceManager[11801]:  INFO [MaintenanceManager.cpp:2276] stopMaintenanceTasks: Stopping maintenance activities
2025-12-15T13:01:19.676Z MaintenanceManager[11801]:  INFO [MaintenanceManager.cpp:2338] stopMaintenanceTasks: Maintenance Status is not MAINTENANCE_STARTED, Hence can not stop the Maintenance execution
2025-12-15T13:01:19.680Z WPEFramework[11801]:  [11857] INFO [MaintenanceManager.cpp:1795] DeinitializeIARM: IARM IARM_Bus_RemoveEventHandler(IARM_BUS_MAINTENANCE_MGR_NAME, IARM_BUS_MAINTENANCEMGR_EVENT_UPDATE, _MaintenanceMgrEventHandler): success
2025-12-15T13:01:19.680Z WPEFramework[11801]:  [SysLog]:[Shutdown]: Deactivated plugin [MaintenanceManager]:[org.rdk.MaintenanceManager]

code of MaintenanceManager stops thread conditionally relying on exact status MAINTENANCE_STARTED in variable m_notify_status. However, crash shows status isn't MAINTENANCE_STARTED and thread is started:

bool MaintenanceManager::stopMaintenanceTasks()
{
...
    if (MAINTENANCE_STARTED == m_notify_status)
    {
...
		if (m_thread.joinable())
		{
		    m_thread.join();

maintenanceManagerOnBootup() sets status MAINTENANCE_IDLE (which is not MAINTENANCE_STARTED) and starts the same thread:

void MaintenanceManager::maintenanceManagerOnBootup()
{
...
            MaintenanceManager::m_notify_status = MAINTENANCE_IDLE;
...
            m_thread = std::thread(&MaintenanceManager::task_execution_thread, _instance);

a bug in MaintenanceManager code.

Steps to reproduce

No response

Expected Behavior

Threads should stop by service's Deinitialize

Actual Behavior

Thread is active in service destructor

Notes (Optional)

No response

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions