Uploaded image for project: 'Firestorm'
  1. Firestorm
  2. FIRE-8200

[BUG-753] [MAINT-1901 ] Viewer crash when adding a local texture from a path containing unicode characters

    Details

    • Type: Bug
    • Status: Passed QA
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: Phoenix Firestorm 4.2.2, Phoenix Firestorm 4.3.0
    • Fix Version/s: Phoenix Firestorm 4.3.1
    • Component/s: Crashes
    • Labels:
    • SL Avatar Name:
      Whirly Fizzle
    • Reported In:
      Firestorm 4.3.0

      Description

      Steps to reproduce:

      • Create a folder on your desktop named ΚυριάκοÏ
      • Place a texture inside this folder (I used a 32 bit tga)
      • Rez a cube -> Edit cube -> Texture tab -> Click texture square
      • Choose Local -> Add -> Browse filepicker to your texture inside the ÎšÏ…ÏÎ¹Î¬ÎºÎ¿Ï folder -> Open

      Viewer crashes with the following message:

      If the windows account name contains unicode, this will also cause a crash.

      Appears not to crash on Linux (confirmed by Miro).
      Appears not to repro on Mac (confirmed by Cinders)

      Callstack:

       	kernel32.dll!_RaiseException@16()  + 0x58 bytes	
       	msvcr100.dll!_CxxThrowException(void * pExceptionObject=0x0273ee3c, const _s__ThrowInfo * pThrowInfo=0x01813c90)  Line 157	C++
       	firestorm-bin.exe!boost::throw_exception<boost::filesystem2::basic_filesystem_error<boost::filesystem2::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::filesystem2::path_traits> > >(const boost::filesystem2::basic_filesystem_error<boost::filesystem2::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::filesystem2::path_traits> > & e={...})  Line 61 + 0x2f bytes	C++
       	firestorm-bin.exe!boost::filesystem2::last_write_time<boost::filesystem2::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::filesystem2::path_traits> >(const boost::filesystem2::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::filesystem2::path_traits> & ph={...})  Line 414	C++
       	firestorm-bin.exe!LLLocalBitmap::updateSelf(LLLocalBitmap::EUpdateType optional_firstupdate=UT_FIRSTUSE)  Line 180 + 0x3a bytes	C++
      >	firestorm-bin.exe!LLLocalBitmap::LLLocalBitmap(std::basic_string<char,std::char_traits<char>,std::allocator<char> > filename="C:\Users\Kirstie\Desktop\ΚυριάκοÏ\test targa.tga")  Line 122	C++
       	firestorm-bin.exe!LLLocalBitmapMgr::addUnit()  Line 801 + 0x3e bytes	C++
       	firestorm-bin.exe!LLFloaterTexturePicker::onBtnAdd(void * userdata=0x321ed100)  Line 882 + 0x5 bytes	C++
       	firestorm-bin.exe!boost::detail::function::void_function_obj_invoker1<boost::_bi::bind_t<void,void (__cdecl*)(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &),boost::_bi::list1<boost::arg<1> > >,void,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &>::invoke(boost::detail::function::function_buffer & function_obj_ptr={...}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & a0="ü«RÔ«R")  Line 153 + 0xb bytes	C++
       	firestorm-bin.exe!boost::detail::function::void_function_obj_invoker2<boost::_bi::bind_t<boost::_bi::unspecified,boost::function<void __cdecl(void *)>,boost::_bi::list1<boost::_bi::value<void *> > >,void,LLUICtrl *,LLSD const &>::invoke(boost::detail::function::function_buffer & function_obj_ptr={...}, LLUICtrl * a0=0x32276300, const LLSD & a1={...})  Line 153 + 0x41 bytes	C++
       	firestorm-bin.exe!boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::slot_invoker::operator()(const boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > & connectionBody={...})  Line 340 + 0x4c bytes	C++
       	firestorm-bin.exe!boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::slot_invoker,std::_List_iterator<std::_List_val<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> >,std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> >::dereference()  Line 82 + 0x1c bytes	C++
       	firestorm-bin.exe!boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::slot_invoker,std::_List_iterator<std::_List_val<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> >,std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::slot_invoker,std::_List_iterator<std::_List_val<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> >,std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost: first={...}, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::slot_invoker,std::_List_iterator<std::_List_val<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> >,std::allocator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot2<void,LLUICtrl *,LLSD const &,boost::function<void __cdecl(LLUICtrl *,LLSD const &)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost: last={...})  Line 65535	C++
       	firestorm-bin.exe!boost::signals2::detail::signal2_impl<void,LLUICtrl *,LLSD const &,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(LLUICtrl *,LLSD const &)>,boost::function<void __cdecl(boost::signals2::connection const &,LLUICtrl *,LLSD const &)>,boost::signals2::mutex>::operator()(LLUICtrl * arg1=0x32276300, const LLSD & arg2={...})  Line 246 + 0xa4 bytes	C++
       	firestorm-bin.exe!LLUICtrl::onCommit()  Line 380 + 0x27 bytes	C++
       	firestorm-bin.exe!LLButton::handleMouseUp(int x=28, int y=7, unsigned int mask=0)  Line 517	C++
       	firestorm-bin.exe!LLMouseHandler::handleAnyMouseClick(int x=28, int y=7, unsigned int mask=0, LLMouseHandler::EClickType clicktype=CLICK_LEFT, int down=0)  Line 49 + 0x13 bytes	C++
       	firestorm-bin.exe!LLViewerWindow::handleAnyMouseClick(LLWindow * window=0x048c6000, LLCoord<LL_COORD_TYPE_GL> pos={...}, unsigned int mask=0, LLMouseHandler::EClickType clicktype=CLICK_LEFT, int down=0)  Line 1004	C++
       	firestorm-bin.exe!LLViewerWindow::handleMouseUp(LLWindow * window=0x048c6000, LLCoord<LL_COORD_TYPE_GL> pos={...}, unsigned int mask=0)  Line 1029	C++
       	firestorm-bin.exe!LLWindowWin32::mainWindowProc(HWND__ * h_wnd=0x00140820, unsigned int u_msg=514, unsigned int w_param=0, long l_param=17629724)  Line 2235	C++
       	user32.dll!_InternalCallWinProc@20()  + 0x23 bytes	
       	user32.dll!_UserCallWinProcCheckWow@32()  + 0xb3 bytes	
       	user32.dll!_CallWindowProcAorW@24()  + 0x51 bytes	
       	user32.dll!_CallWindowProcW@20()  + 0x1b bytes	
       	opengl32.dll!_wglWndProc@16()  + 0x20e bytes	
       	user32.dll!_InternalCallWinProc@20()  + 0x23 bytes	
       	user32.dll!_UserCallWinProcCheckWow@32()  + 0xb3 bytes	
       	user32.dll!_DispatchMessageWorker@8()  + 0x19e bytes	
       	user32.dll!_DispatchMessageW@4()  + 0xf bytes	
       	firestorm-bin.exe!LLWindowWin32::gatherInput()  Line 1798	C++
       	firestorm-bin.exe!LLAppViewer::mainLoop()  Line 1379	C++
       	firestorm-bin.exe!WinMain(HINSTANCE__ * hInstance=0x00280000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x02892f52, int nCmdShow=1)  Line 190	C++
       	firestorm-bin.exe!__tmainCRTStartup()  Line 547 + 0x1c bytes	C
       	kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes	
       	ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes	
       	ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes	
      

      Viewer logs just cut dead.

        Issue Links

          Activity

          Hide
          whirly.fizzle Whirly Fizzle added a comment -

          Tested Nicky's patch and no crash. Set as 4.3.1.

          Show
          whirly.fizzle Whirly Fizzle added a comment - Tested Nicky's patch and no crash. Set as 4.3.1.
          Hide
          nickyd Nicky added a comment -
          Show
          nickyd Nicky added a comment - Fixed with http://hg.phoenixviewer.com/phoenix-firestorm-lgpl/rev/fa8cbd7c54e9

            People

            • Assignee:
              nickyd Nicky
              Reporter:
              whirly.fizzle Whirly Fizzle
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: