Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xrUICore: Cleanup CUILines::GetColorFromText #1817

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from

Conversation

AMS21
Copy link
Contributor

@AMS21 AMS21 commented Mar 7, 2025

  • Some general cleanup and modernization.
  • Fixed buffer overflow due to incorrect usage of std::string::find.
  • When looking up the XML color defs, instead of linearly searching through the list (O(n)), we now simply do a map lookup (O(1)).

- Some general cleanup and modernization.
- Fixed buffer overflow due to incorrect usage of `std::string::find`.
- When looking up the XML color defs, instead of linearly searching through the list (O(n)), we now simply do a map lookup (O(1)).
@AMS21
Copy link
Contributor Author

AMS21 commented Mar 7, 2025

For those interested this is the ASAN report:

=================================================================
==655691==ERROR: AddressSanitizer: global-buffer-overflow on address 0x7fffd37f85ec at pc 0x7ffff788f0c5 bp 0x7fffffff6770 sp 0x7fffffff5f18
READ of size 18 at 0x7fffd37f85ec thread T0
    #0 0x7ffff788f0c4 in MemcmpInterceptorCommon(void*, int (*)(void const*, void const*, unsigned long), void const*, void const*, unsigned long) /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:814
    #1 0x7ffff78900ab in memcmp /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:845
    #2 0x7ffff78900ab in memcmp /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:840
    #3 0x7fffe3ecb7ca in std::char_traits<char>::compare(char const*, char const*, unsigned long) /usr/include/c++/14.2.1/bits/char_traits.h:381
    #4 0x7fffe6da3085 in std::__cxx11::basic_string<char, std::char_traits<char>, xalloc<char> >::find(char const*, unsigned long, unsigned long) const /usr/include/c++/14.2.1/bits/basic_string.tcc:653
    #5 0x7fffd352518a in CUILines::GetColorFromText(std::__cxx11::basic_string<char, std::char_traits<char>, xalloc<char> > const&) const /mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp:453
    #6 0x7fffd3525d8a in CUILines::CutFirstColoredTextEntry(std::__cxx11::basic_string<char, std::char_traits<char>, xalloc<char> >&, unsigned int&, std::__cxx11::basic_string<char, std::char_traits<char>, xalloc<char> >&) const /mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp:528
    #7 0x7fffd35261ef in CUILines::ParseTextToColoredLine(std::__cxx11::basic_string<char, std::char_traits<char>, xalloc<char> > const&) /mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp:498
    #8 0x7fffd35266b3 in CUILines::ParseText(bool) /mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp:93
    #9 0x7fffd361f460 in CUIStatic::AdjustHeightToText() /mnt/data/dev/xray-16/src/xrUICore/Static/UIStatic.cpp:223
    #10 0x7fffe69d5345 in CUIAnswerItem::Init(char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/ui/UITalkDialogWnd.cpp:491
    #11 0x7fffe69d9cca in CUIAnswerItemIconed::Init(char const*, char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/ui/UITalkDialogWnd.cpp:516
    #12 0x7fffe69db1f3 in CUITalkDialogWnd::AddIconedAnswer(char const*, char const*, char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/ui/UITalkDialogWnd.cpp:258
    #13 0x7fffe69dd787 in CUITalkWnd::AddIconedMessage(char const*, char const*, char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/ui/UITalkWnd.cpp:479
    #14 0x7fffe5447080 in _AddIconedTalkMessage(char const*, char const*, char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/script_game_object_inventory_owner.cpp:99
    #15 0x7fffe544725a in CScriptGameObject::AddIconedTalkMessage(char const*, char const*, char const*, char const*) /mnt/data/dev/xray-16/src/xrGame/script_game_object_inventory_owner.cpp:111
    #16 0x7fffe558b558 in luabind::detail::invoke_struct<luabind::meta::type_list<>, luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, void (CScriptGameObject::*)(char const*, char const*, char const*, char const*)>::call_struct<true, true, luabind::meta::index_list<0u, 1u, 2u, 3u, 4u> >::call(lua_State*, void (CScriptGameObject::*&)(char const*, char const*, char const*, char const*), std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void> >&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:295
    #17 0x7fffe55c3ffa in int luabind::detail::invoke_struct<luabind::meta::type_list<>, luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, void (CScriptGameObject::*)(char const*, char const*, char const*, char const*)>::call_fun<std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void> > >(lua_State*, luabind::detail::invoke_context&, void (CScriptGameObject::*&)(char const*, char const*, char const*, char const*), int, std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void>, luabind::default_converter<char const*, void> >&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:317
    #18 0x7fffe55c3ffa in luabind::detail::invoke_struct<luabind::meta::type_list<>, luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, void (CScriptGameObject::*)(char const*, char const*, char const*, char const*)>::invoke(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (CScriptGameObject::*&)(char const*, char const*, char const*, char const*)) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:374
    #19 0x7fffe55c40c4 in int luabind::detail::invoke<luabind::meta::type_list<>, luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, void (CScriptGameObject::*)(char const*, char const*, char const*, char const*)>(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (CScriptGameObject::*&)(char const*, char const*, char const*, char const*)) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:392
    #20 0x7fffe55c40c4 in luabind::detail::function_object_impl<void (CScriptGameObject::*)(char const*, char const*, char const*, char const*), luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, luabind::meta::type_list<> >::invoke_defer(lua_State*, luabind::detail::function_object_impl<void (CScriptGameObject::*)(char const*, char const*, char const*, char const*), luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, luabind::meta::type_list<> >*, luabind::detail::invoke_context&, int&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/make_function.hpp:51
    #21 0x7fffe55c428b in luabind::detail::function_object_impl<void (CScriptGameObject::*)(char const*, char const*, char const*, char const*), luabind::meta::type_list<void, CScriptGameObject&, char const*, char const*, char const*, char const*>, luabind::meta::type_list<> >::entry_point(lua_State*) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/make_function.hpp:73
    #22 0x7fffd6184a14 in lj_BC_FUNCC /mnt/data/dev/xray-16/bin/buildvm_x86.dasc:849
    #23 0x7fffd6199074 in lua_pcall /mnt/data/dev/xray-16/Externals/LuaJIT/src/lj_api.c:1218
    #24 0x7fffd4f84b1e in luabind::detail::pcall(lua_State*, int, int) /mnt/data/dev/xray-16/Externals/luabind/src/pcall.cpp:43
    #25 0x7fffe4a7b397 in void luabind::detail::call_function_struct<void, luabind::meta::type_list<>, luabind::meta::index_list<1u, 2u, 3u>, 1u, &luabind::detail::pcall, true>::call<luabind::adl::object&, CGameTask*, ETaskState>(lua_State*, luabind::adl::object&, CGameTask*&&, ETaskState&&) (/mnt/data/dev/xray-16/bin/x86_64/Debug/xrGame.so+0xc67b397) (BuildId: 2efd2552615bda5402aaf7cdddb856665e026e9c)
    #26 0x7fffe4a7b4b1 in void luabind::call_pushed_function<void, luabind::meta::type_list<>, luabind::adl::object&, CGameTask*, ETaskState>(lua_State*, luabind::adl::object&, CGameTask*&&, ETaskState&&) (/mnt/data/dev/xray-16/bin/x86_64/Debug/xrGame.so+0xc67b4b1) (BuildId: 2efd2552615bda5402aaf7cdddb856665e026e9c)
    #27 0x7fffe4a7b50a in void luabind::call_function<void, luabind::meta::type_list<>, luabind::adl::object&, CGameTask*, ETaskState>(luabind::adl::object const&, luabind::adl::object&, CGameTask*&&, ETaskState&&) (/mnt/data/dev/xray-16/bin/x86_64/Debug/xrGame.so+0xc67b50a) (BuildId: 2efd2552615bda5402aaf7cdddb856665e026e9c)
    #28 0x7fffe4a7bc15 in void CScriptCallbackEx<void>::operator()<CGameTask*, ETaskState>(CGameTask*&&, ETaskState&&) (/mnt/data/dev/xray-16/bin/x86_64/Debug/xrGame.so+0xc67bc15) (BuildId: 2efd2552615bda5402aaf7cdddb856665e026e9c)
    #29 0x7fffe4a6e24a in CGameTask::ChangeStateCallback() /mnt/data/dev/xray-16/src/xrGame/GameTask.cpp:476
    #30 0x7fffe4a8143b in CGameTaskManager::GiveGameTaskToActor(CGameTask*, unsigned int, bool, unsigned int) /mnt/data/dev/xray-16/src/xrGame/GametaskManager.cpp:142
    #31 0x7fffe5447a5c in CScriptGameObject::GiveTaskToActor(CGameTask*, unsigned int, bool, unsigned int) /mnt/data/dev/xray-16/src/xrGame/script_game_object_inventory_owner.cpp:1282
    #32 0x7fffe563503c in luabind::detail::invoke_struct<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject&, CGameTask*, unsigned int, bool, unsigned int>, void (CScriptGameObject::* const)(CGameTask*, unsigned int, bool, unsigned int)>::call_struct<true, true, luabind::meta::index_list<0u, 1u, 2u, 3u, 4u> >::call(lua_State*, void (CScriptGameObject::* const&)(CGameTask*, unsigned int, bool, unsigned int), std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::detail::adopt_pointer<void, luabind::detail::lua_to_cpp>, luabind::default_converter<unsigned int, void>, luabind::default_converter<bool, void>, luabind::default_converter<unsigned int, void> >&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:295
    #33 0x7fffe56356a0 in int luabind::detail::invoke_struct<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject&, CGameTask*, unsigned int, bool, unsigned int>, void (CScriptGameObject::* const)(CGameTask*, unsigned int, bool, unsigned int)>::call_fun<std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::detail::adopt_pointer<void, luabind::detail::lua_to_cpp>, luabind::default_converter<unsigned int, void>, luabind::default_converter<bool, void>, luabind::default_converter<unsigned int, void> > >(lua_State*, luabind::detail::invoke_context&, void (CScriptGameObject::* const&)(CGameTask*, unsigned int, bool, unsigned int), int, std::tuple<luabind::default_converter<CScriptGameObject&, void>, luabind::detail::adopt_pointer<void, luabind::detail::lua_to_cpp>, luabind::default_converter<unsigned int, void>, luabind::default_converter<bool, void>, luabind::default_converter<unsigned int, void> >&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:317
    #34 0x7fffe56356a0 in luabind::detail::invoke_struct<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject&, CGameTask*, unsigned int, bool, unsigned int>, void (CScriptGameObject::* const)(CGameTask*, unsigned int, bool, unsigned int)>::call_best_match(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (CScriptGameObject::* const&)(CGameTask*, unsigned int, bool, unsigned int), int) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:355
    #35 0x7fffe563573d in int luabind::detail::call_best_match<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject&, CGameTask*, unsigned int, bool, unsigned int>, void (CScriptGameObject::* const)(CGameTask*, unsigned int, bool, unsigned int)>(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (CScriptGameObject::* const&)(CGameTask*, unsigned int, bool, unsigned int), int) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:386
    #36 0x7fffe563573d in luabind::detail::function_object_impl<void (CScriptGameObject::*)(CGameTask*, unsigned int, bool, unsigned int), luabind::meta::type_list<void, CScriptGameObject&, CGameTask*, unsigned int, bool, unsigned int>, luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > > >::call(lua_State*, luabind::detail::invoke_context&, int) const /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/make_function.hpp:38
    #37 0x7fffe55c1e9a in luabind::detail::invoke_struct<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool)>::call_best_match(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (*&)(CScriptGameObject*, CGameTask*, unsigned int, bool), int) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:352
    #38 0x7fffe55c231d in luabind::detail::invoke_struct<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool)>::invoke(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (*&)(CScriptGameObject*, CGameTask*, unsigned int, bool)) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:378
    #39 0x7fffe55c253d in int luabind::detail::invoke<luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > >, luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool)>(lua_State*, luabind::detail::function_object const&, luabind::detail::invoke_context&, void (*&)(CScriptGameObject*, CGameTask*, unsigned int, bool)) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call.hpp:392
    #40 0x7fffe55c253d in luabind::detail::function_object_impl<void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool), luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > > >::invoke_defer(lua_State*, luabind::detail::function_object_impl<void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool), luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > > >*, luabind::detail::invoke_context&, int&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/make_function.hpp:51
    #41 0x7fffe55c2704 in luabind::detail::function_object_impl<void (*)(CScriptGameObject*, CGameTask*, unsigned int, bool), luabind::meta::type_list<void, CScriptGameObject*, CGameTask*, unsigned int, bool>, luabind::meta::type_list<luabind::converter_policy_injector<2u, luabind::detail::adopt_policy_impl<void> > > >::entry_point(lua_State*) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/make_function.hpp:73
    #42 0x7fffd6184a14 in lj_BC_FUNCC /mnt/data/dev/xray-16/bin/buildvm_x86.dasc:849
    #43 0x7fffd6199074 in lua_pcall /mnt/data/dev/xray-16/Externals/LuaJIT/src/lj_api.c:1218
    #44 0x7fffd4f84b1e in luabind::detail::pcall(lua_State*, int, int) /mnt/data/dev/xray-16/Externals/luabind/src/pcall.cpp:43
    #45 0x7fffe4838ead in void luabind::detail::call_member_impl<void, luabind::meta::type_list<>, 1u, unsigned int&>(lua_State*, std::integral_constant<bool, true>, luabind::meta::index_list<1u>, unsigned int&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call_member.hpp:54
    #46 0x7fffe483909a in void luabind::wrap_base::call<void, unsigned int&>(char const*, unsigned int&) const /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/wrapper_base.hpp:92
    #47 0x7fffe4839156 in void luabind::call_member<void, unsigned int&>(luabind::wrap_base const*, char const*, unsigned int&) /mnt/data/dev/xray-16/Externals/luabind/src/../luabind/detail/call_member.hpp:123
    #48 0x7fffe537af84 in CScriptBinderObjectWrapper::shedule_Update(unsigned int) /mnt/data/dev/xray-16/src/xrGame/script_binder_object_wrapper.cpp:62
    #49 0x7fffe534d347 in CScriptBinder::shedule_Update(unsigned int) /mnt/data/dev/xray-16/src/xrGame/script_binder.cpp:157
    #50 0x7fffe4890bd3 in CGameObject::shedule_Update(unsigned int) /mnt/data/dev/xray-16/src/xrGame/GameObject.cpp:1206
    #51 0x7fffd7559c52 in CSheduler::ProcessStep() /mnt/data/dev/xray-16/src/xrEngine/xrSheduler.cpp:371
    #52 0x7fffd755d4c6 in CSheduler::Update() /mnt/data/dev/xray-16/src/xrEngine/xrSheduler.cpp:467
    #53 0x7fffe48ab555 in CGamePersistent::OnFrame() /mnt/data/dev/xray-16/src/xrGame/GamePersistent.cpp:616
    #54 0x7fffd757a57e in pureFrame::OnPure(pureFrame*) /mnt/data/dev/xray-16/src/xrEngine/pure.h:18
    #55 0x7fffd757a57e in MessageRegistry<pureFrame>::Process() /mnt/data/dev/xray-16/src/xrEngine/pure.h:101
    #56 0x7fffd756aad7 in CRenderDevice::FrameMove() /mnt/data/dev/xray-16/src/xrEngine/device.cpp:483
    #57 0x7fffd756b177 in CRenderDevice::ProcessFrame() /mnt/data/dev/xray-16/src/xrEngine/device.cpp:269
    #58 0x7fffd7525f13 in CApplication::Run() /mnt/data/dev/xray-16/src/xrEngine/x_ray.cpp:445
    #59 0x555555557469 in entry_point(char const*) /mnt/data/dev/xray-16/src/xr_3da/entry_point.cpp:38
    #60 0x5555555578d1 in main /mnt/data/dev/xray-16/src/xr_3da/entry_point.cpp:89
    #61 0x7fffd54278cd  (/usr/lib/libc.so.6+0x278cd) (BuildId: 6cb3848fe8b7e02ffe7b4d9db1cffb88b14b0659)
    #62 0x7fffd5427989 in __libc_start_main (/usr/lib/libc.so.6+0x27989) (BuildId: 6cb3848fe8b7e02ffe7b4d9db1cffb88b14b0659)
    #63 0x555555557254 in _start (/mnt/data/dev/xray-16/bin/x86_64/Debug/xr_3da+0x3254) (BuildId: b07e74453e53ea26fc3b0d1fc1e1df87f9dd4483)

0x7fffd37f85ec is located 0 bytes after global variable '*.LC38' defined in '/mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp' (0x7fffd37f85e0) of size 12
  '*.LC38' is ascii string '%c[default]'
0x7fffd37f85ec is located 52 bytes before global variable '*.LC40' defined in '/mnt/data/dev/xray-16/src/xrUICore/Lines/UILines.cpp' (0x7fffd37f8620) of size 25
  '*.LC40' is ascii string 'basic_string::_M_replace'
SUMMARY: AddressSanitizer: global-buffer-overflow /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:814 in MemcmpInterceptorCommon(void*, int (*)(void const*, void const*, unsigned long), void const*, void const*, unsigned long)
Shadow bytes around the buggy address:
  0x7fffd37f8300: f9 f9 f9 f9 00 00 02 f9 f9 f9 f9 f9 03 f9 f9 f9
  0x7fffd37f8380: f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9 00 00 00 00
  0x7fffd37f8400: 00 00 07 f9 f9 f9 f9 f9 00 00 06 f9 f9 f9 f9 f9
  0x7fffd37f8480: 00 00 00 f9 f9 f9 f9 f9 00 00 00 00 00 00 02 f9
  0x7fffd37f8500: f9 f9 f9 f9 00 00 00 03 f9 f9 f9 f9 00 00 05 f9
=>0x7fffd37f8580: f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9 00[04]f9 f9
  0x7fffd37f8600: f9 f9 f9 f9 00 00 00 01 f9 f9 f9 f9 00 00 06 f9
  0x7fffd37f8680: f9 f9 f9 f9 00 00 00 00 00 00 01 f9 f9 f9 f9 f9
  0x7fffd37f8700: 00 00 00 02 f9 f9 f9 f9 00 02 f9 f9 f9 f9 f9 f9
  0x7fffd37f8780: 04 f9 f9 f9 f9 f9 f9 f9 00 00 04 f9 f9 f9 f9 f9
  0x7fffd37f8800: 03 f9 f9 f9 f9 f9 f9 f9 00 00 00 00 00 f9 f9 f9
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==655691==ABORTING

for (CUIXmlInitBase::ColorDefs::const_iterator it = CUIXmlInitBase::GetColorDefs()->begin();
it != CUIXmlInitBase::GetColorDefs()->end(); ++it)
const auto* color_defs = CUIXmlInitBase::GetColorDefs();
if (color_defs->contains(color_tag.c_str()))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is actually wrong.
ColorDefs are containing solely the color names, so it should be searching for default instead of %c[default], like the new code does.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants