On Wed, Oct 20, 2021 at 02:06:49PM +0200, Rubén Llorente wrote: > On Wed, Oct 20, 2021 at 01:34:20PM +0200, Solene Rapenne wrote: > > > > this seems a fluxbox bug which is not OpenBSD specific, you should > > rather report it on fluxbox bug tracker if any. > > I can't reproduce it on Linux. > > On the other hand I have not seen anything in the code that was OpenBSD > specific in this regard so I am a bit confused. > > I don't think Fluxbox has a formal bug tracker. I might dust off my > rusty gdb skills and see what is going on, but really, I should be > considered a last resort :-) > > -- > OpenPGP Key Fingerprint: > 543F EB89 7FDE 8E33 AFF7 E794 E4AB 4807 58F7 6C76
It's definaltly a use after free issue. Linux is more permissive than OpenBSD in this area. Here's a excerpt of a debuging session :: Thread 1 received signal SIGSEGV, Segmentation fault. 0x000002237870b2ef in std::__1::less<unsigned long>::operator() ( this=0x22378872770 <FbTk::EventManager::instance()::ev+16>, __x=<error reading variable>, __y=@0x7f7ffffe9878: 2097514) at /usr/include/c++/v1/__functional_base:54 54 {return __x < __y;} (gdb) p __x $1 = (const unsigned long &) <error reading variable> (gdb) p __y $2 = (const unsigned long &) @0x7f7ffffe9878: 2097514 (gdb) up #1 0x000002237870bcf2 in std::__1::__map_value_compare<unsigned long, std::__1::__value_type<unsigned long, FbTk::EventHandler*>, std::__1::less<unsigned long>, true>::operator() ( this=0x22378872770 <FbTk::EventManager::instance()::ev+16>, __x=..., __y=@0x7f7ffffe9878: 2097514) at /usr/include/c++/v1/map:518 518 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} (gdb) p __x $3 = (const std::__1::__value_type<unsigned long, FbTk::EventHandler*> &) <error reading variable> (gdb) up #2 0x000002237871084b in std::__1::__tree<std::__1::__value_type<unsigned long, FbTk::EventHandler*>, std::__1::__map_value_compare<unsigned long, std::__1::__value_type<unsigned long, FbTk::EventHandler*>, std::__1::less<unsigned long>, true>, std::__1::allocator<std::__1::__value_type<unsigned long, FbTk::EventHandler*> > >::__lower_bound<unsigned long> (this=0x22378872760 <FbTk::EventManager::instance()::ev>, __v=@0x7f7ffffe9878: 2097514, __root=0xdfdfdfdfdfdfdfdf, __result=0x2259e120ac0) at /usr/include/c++/v1/__tree:2637 2637 if (!value_comp()(__root->__value_, __v)) (gdb) p __root $4 = (std::__1::__tree<std::__1::__value_type<unsigned long, FbTk::EventHandler*>, std::__1::__map_value_compare<unsigned long, std::__1::__value_type<unsigned long, FbTk::EventHandler*>, std::__1::less<unsigned long>, true>, std::__1::allocator<std::__1::__value_type<unsigned long, FbTk::EventHandler*> > >::__node_pointer) 0xdfdfdfdfdfdfdfdf (gdb) p __root->__value_ Cannot access memory at address 0xdfdfdfdfdfdfdfff >>» 0xdfdf is used by free() to mark free'd memory. Sorry, I don't want to dig deeper into that. A way to "fix" the issue, a tad better than ignoring SIGSEGV is to use _exit(2) instead of exit(3) in handleXIOErrors() : this won't call the problematic C++ destructors. -- Matthieu Herrb