cortoproject / corto

A hierarchical object store for connecting realtime machine data with web applications, historians & more
https://www.corto.io
MIT License
86 stars 14 forks source link

Corto observer invalid when notifying during shutdown #685

Closed hendrenja closed 6 years ago

hendrenja commented 6 years ago

When a corto observer is not deleted before corto shutdown, it can crash corto with the following trace (obtained from valgrind):

==14248== Invalid read of size 8
==14248==    at 0xD6C7831: corto_notify_observer_cdecl (observer.c:425)
==14248==    by 0xD6C7B71: corto_notify_observers_intern (observer.c:504)
==14248==    by 0xD6C7D49: corto_notify (observer.c:562)
==14248==    by 0xD6E378F: corto_destruct (object.c:2117)
==14248==    by 0xD710A45: corto_collect_traverse (collect.c:176)
==14248==    by 0xD710BAE: corto_collect_traverse (collect.c:237)
==14248==    by 0xD710BAE: corto_collect_traverse (collect.c:237)
==14248==    by 0xD710BAE: corto_collect_traverse (collect.c:237)
==14248==    by 0xD710DB1: corto_collect (collect.c:277)
==14248==    by 0xD716131: corto_stop (bootstrap.c:1344)
==14248==    by 0x134019: main (_project.cpp:34)
==14248==  Address 0x163bbc48 is 8 bytes inside a block of size 24 free'd
==14248==    at 0x4C2CDDB: free (vg_replace_malloc.c:530)
==14248==    by 0xD6E093A: corto__deinitObservable (object.c:817)
==14248==    by 0xD6E388D: corto_destruct (object.c:2145)
==14248==    by 0xD710A45: corto_collect_traverse (collect.c:176)
==14248==    by 0xD710BAE: corto_collect_traverse (collect.c:237)
==14248==    by 0xD710BAE: corto_collect_traverse (collect.c:237)
==14248==    by 0xD710DB1: corto_collect (collect.c:277)
==14248==    by 0xD716131: corto_stop (bootstrap.c:1344)
==14248==    by 0x134019: main (_project.cpp:34)
==14248==  Block was alloc'd at
==14248==    at 0x4C2BBAF: malloc (vg_replace_malloc.c:299)
==14248==    by 0xD6C8EE6: _corto_observer_observe (observer.c:1022)
==14248==    by 0xD6C879C: _corto_observer_construct (observer.c:863)
==14248==    by 0xD6E0C0C: corto_invoke_preDelegate (object.c:902)
==14248==    by 0xD6E2C57: corto_defineDeclared (object.c:1794)
==14248==    by 0xD6E342E: corto_define_intern (object.c:2034)
==14248==    by 0xD6E3524: corto_define (object.c:2060)
==14248==    by 0xD6C82E9: corto_observeObserve (observer.c:727)
==14248==    by 0xD6C84B1: corto_observeCallback (observer.c:790)
==14248==    by 0x1297C0: CDataManager::InitializeDataManager() (data_manager.cpp:132)
==14248==    by 0x11E5B9: CVisionService::Initialize() (vision_service.cpp:20)
==14248==    by 0xCDCC783: oasys::core::controllers::CServiceManager::RegisterService(std::shared_ptr<oasys::core::controllers::CServiceBase>, unsigned long) (service_manager.cpp:29)
==14248==    by 0xCDCC609: oasys::core::controllers::CServiceManager::RegisterService(std::shared_ptr<oasys::core::controllers::CServiceBase>) (service_manager.cpp:14)
==14248==    by 0x125C53: CController::Initialize() (controller.cpp:22)
==14248==    by 0xCDD2A95: oasys::core::controllers::CApp::Start() (app.cpp:58)
==14248==    by 0x133BFF: cortomain (vision.cpp:12)
==14248==    by 0x134011: main (_project.cpp:32)