godotengine / godot

Godot Engine – Multi-platform 2D and 3D game engine
https://godotengine.org
MIT License
88.97k stars 20.18k forks source link

Godot crashes when importing a certain SVG icon with embedded PNG images #91781

Closed nongvantinh closed 2 months ago

nongvantinh commented 4 months ago

Tested versions

Godot Engine v4.2.stable.official.46dc27791 also happens with mono version

System information

Windows 11

Issue description

Godot crashes when importing a certain SVG icon

Steps to reproduce

Simply place this file somewhere in the project folder and return to the editor. Godot will attempt to import the file and crash. SpikedBulletIcon

Minimal reproduction project (MRP)

If you don’t want to create a minimal reproducible project (MRP) yourself, you can use mine. godot-crash.zip

matheusmdx commented 4 months ago

Here the backtrace using a debug version:

================================================================
CrashHandlerException: Program crashed
Engine version: Godot Engine v4.3.dev.custom_build (4577dfdb6747600438ac4b86c29a4d6c12ec9b0a)
Dumping the backtrace. Please include this when reporting the bug to the project developer.
[0] _apply (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRasterTexmap.h:1054)
[1] _apply (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRasterTexmap.h:1054)
[2] _rasterTexmapPolygon (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRasterTexmap.h:1141)
[3] _rasterImage (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRaster.cpp:1421)
[4] rasterImage (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRaster.cpp:1936)
[5] tvg::SwRenderer::renderImage (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\sw_engine\tvgSwRenderer.cpp:491)
[6] tvg::Picture::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPicture.cpp:75)
[7] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[8] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[9] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[10] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[11] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[12] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[13] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[14] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[15] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[16] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[17] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[18] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[19] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[20] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[21] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[22] tvg::Scene::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgScene.h:151)
[23] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[24] tvg::Picture::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPicture.cpp:82)
[25] tvg::Paint::Impl::render (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgPaint.cpp:224)
[26] tvg::Canvas::Impl::draw (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgCanvas.h:120)
[27] tvg::Canvas::draw (C:\Users\Matheus\Downloads\Godot Source Git\godot\thirdparty\thorvg\src\renderer\tvgCanvas.cpp:67)
[28] ImageLoaderSVG::create_image_from_utf8_buffer (C:\Users\Matheus\Downloads\Godot Source Git\godot\modules\svg\image_loader_svg.cpp:122)
[29] ImageLoaderSVG::create_image_from_utf8_buffer (C:\Users\Matheus\Downloads\Godot Source Git\godot\modules\svg\image_loader_svg.cpp:156)
[30] ImageLoaderSVG::create_image_from_string (C:\Users\Matheus\Downloads\Godot Source Git\godot\modules\svg\image_loader_svg.cpp:168)
[31] ImageLoaderSVG::load_image (C:\Users\Matheus\Downloads\Godot Source Git\godot\modules\svg\image_loader_svg.cpp:182)[32] ImageLoader::load_image (C:\Users\Matheus\Downloads\Godot Source Git\godot\core\io\image_loader.cpp:99)
[33] ResourceImporterTexture::import (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\import\resource_importer_texture.cpp:490)
[34] EditorFileSystem::_reimport_file (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\editor_file_system.cpp:2132)
[35] EditorFileSystem::reimport_files (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\editor_file_system.cpp:2374)
[36] EditorFileSystem::_update_scan_actions (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\editor_file_system.cpp:701)
[37] EditorFileSystem::_notification (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\editor_file_system.cpp:1299)
[38] EditorFileSystem::_notificationv (C:\Users\Matheus\Downloads\Godot Source Git\godot\editor\editor_file_system.h:146)
[39] Object::notification (C:\Users\Matheus\Downloads\Godot Source Git\godot\core\object\object.cpp:840)
[40] SceneTree::_process_group (C:\Users\Matheus\Downloads\Godot Source Git\godot\scene\main\scene_tree.cpp:954)
[41] SceneTree::_process (C:\Users\Matheus\Downloads\Godot Source Git\godot\scene\main\scene_tree.cpp:1031)
[42] SceneTree::process (C:\Users\Matheus\Downloads\Godot Source Git\godot\scene\main\scene_tree.cpp:510)
[43] Main::iteration (C:\Users\Matheus\Downloads\Godot Source Git\godot\main\main.cpp:3814)
[44] OS_Windows::run (C:\Users\Matheus\Downloads\Godot Source Git\godot\platform\windows\os_windows.cpp:1476)
[45] widechar_main (C:\Users\Matheus\Downloads\Godot Source Git\godot\platform\windows\godot_windows.cpp:182)
[46] _main (C:\Users\Matheus\Downloads\Godot Source Git\godot\platform\windows\godot_windows.cpp:204)
[47] main (C:\Users\Matheus\Downloads\Godot Source Git\godot\platform\windows\godot_windows.cpp:218)
[48] WinMain (C:\Users\Matheus\Downloads\Godot Source Git\godot\platform\windows\godot_windows.cpp:232)
[49] __scrt_common_main_seh (D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
[50] <couldn't map PC to fn name>
-- END OF BACKTRACE --
================================================================
akien-mga commented 4 months ago

I can confirm the crash, and it's still reproducible in latest thorvg 0.13.3 (as of #91788).

Full gdb backtrace with thorvg 0.13.3:

Thread 1 "godot-git" received signal SIGSEGV, Segmentation fault.
0x000000000710502d in _apply (surface=0x7fff90003170, aaSpans=0x15278280) at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRasterTexmap.h:1054
1054                    *dst = INTERPOLATE(*dst, pixel, line->coverage[0] * pos);

(gdb) bt
#0  0x000000000710502d in _apply (surface=0x7fff90003170, aaSpans=0x15278280) at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRasterTexmap.h:1054
#1  0x00000000071055e3 in _rasterTexmapPolygon (surface=0x7fff90003170, image=0x1f02fb38, transform=0xbbbf110, region=0x0, opacity=255 '\377')
    at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRasterTexmap.h:1140
#2  0x000000000710a884 in _rasterImage (surface=0x7fff90003170, image=0x1f02fb38, transform=0xbbbf110, region=..., opacity=255 '\377') at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp:1421
#3  0x000000000710b586 in rasterImage (surface=0x7fff90003170, image=0x1f02fb38, mesh=0x7fff5c002308, transform=0xbbbf110, bbox=..., opacity=255 '\377')
    at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp:1940
#4  0x000000000710f551 in tvg::SwRenderer::renderImage (this=0x7fff90003200, data=0x1f02fa70) at thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp:487
#5  0x00000000070f5a54 in tvg::Picture::Impl::render (this=0x7fff5c0022e0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPicture.cpp:75
#6  0x00000000070f1996 in tvg::Paint::Impl::render (this=0x7fff5c0a2a70, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#7  0x00000000070f4604 in tvg::Scene::Impl::render (this=0x7fff5c0ddd30, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#8  0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c093e70, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#9  0x00000000070f4604 in tvg::Scene::Impl::render (this=0x7fff5c0ddcb0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#10 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c09cf60, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#11 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x7fff5c0cc3f0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#12 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c01f5c0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#13 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x21208780, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#14 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c0987d0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#15 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x19bc5430, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#16 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c08be50, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#17 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x2032b390, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#18 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c084000, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#19 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x7fff5c0db220, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
#20 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c08a8b0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#21 0x00000000070f4604 in tvg::Scene::Impl::render (this=0x7fff5c0db660, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgScene.h:139
--Type <RET> for more, q to quit, c to continue without paging--
#22 0x00000000070f1977 in tvg::Paint::Impl::render (this=0x7fff5c0730c0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#23 0x00000000070f5b22 in tvg::Picture::Impl::render (this=0x202ee8c0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPicture.cpp:82
#24 0x00000000070f1996 in tvg::Paint::Impl::render (this=0x1ea941b0, renderer=0x7fff90003200) at thirdparty/thorvg/src/renderer/tvgPaint.cpp:219
#25 0x00000000070edf6d in tvg::Canvas::Impl::draw (this=0x1f263370) at thirdparty/thorvg/src/renderer/tvgCanvas.h:118
#26 0x00000000070ed856 in tvg::Canvas::draw (this=0x16403f70) at thirdparty/thorvg/src/renderer/tvgCanvas.cpp:67
#27 0x0000000007119662 in ImageLoaderSVG::create_image_from_utf8_buffer (p_image=..., 
    p_buffer=0x23cd4930 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 5"..., p_buffer_size=36294, p_scale=1, p_upsample=false) at modules/svg/image_loader_svg.cpp:122
#28 0x0000000007119963 in ImageLoaderSVG::create_image_from_utf8_buffer (p_image=..., p_buffer=..., p_scale=1, p_upsample=false) at modules/svg/image_loader_svg.cpp:156
#29 0x0000000007119a9a in ImageLoaderSVG::create_image_from_string (p_image=..., p_string=..., p_scale=1, p_upsample=false, p_color_map=...) at modules/svg/image_loader_svg.cpp:168
#30 0x0000000007119d3c in ImageLoaderSVG::load_image (this=0xcf17810, p_image=..., p_fileaccess=..., p_flags=..., p_scale=1) at modules/svg/image_loader_svg.cpp:190
#31 0x000000000a60a846 in ImageLoader::load_image (p_file=..., p_image=..., p_custom=..., p_flags=..., p_scale=1) at ./core/io/image_loader.cpp:99
#32 0x0000000007d3a6c2 in ResourceImporterTexture::import (this=0x7fff5c00e600, p_source_file=..., p_save_path=..., p_options=..., r_platform_variants=0x7fffffffbf10, r_gen_files=0x7fffffffbf08, 
    r_metadata=0x7fffffffbef0) at ./editor/import/resource_importer_texture.cpp:490
#33 0x00000000076a61b8 in EditorFileSystem::_reimport_file (this=0xd23d5e0, p_file=..., p_custom_options=..., p_custom_importer=..., p_generator_parameters=0x0) at ./editor/editor_file_system.cpp:2160
#34 0x00000000076a8d59 in EditorFileSystem::reimport_files (this=0xd23d5e0, p_files=...) at ./editor/editor_file_system.cpp:2405
#35 0x000000000769b913 in EditorFileSystem::_update_scan_actions (this=0xd23d5e0) at ./editor/editor_file_system.cpp:696
#36 0x000000000769f280 in EditorFileSystem::_notification (this=0xd23d5e0, p_what=17) at ./editor/editor_file_system.cpp:1294
#37 0x000000000773b636 in EditorFileSystem::_notificationv (this=0xd23d5e0, p_notification=17, p_reversed=false) at ./editor/editor_file_system.h:138
#38 0x000000000aabfc52 in Object::notification (this=0xd23d5e0, p_notification=17, p_reversed=false) at ./core/object/object.cpp:904
#39 0x00000000086076e4 in SceneTree::_process_group (this=0xd16aed0, p_group=0xd16b128, p_physics=false) at ./scene/main/scene_tree.cpp:963
#40 0x0000000008607c5d in SceneTree::_process (this=0xd16aed0, p_physics=false) at ./scene/main/scene_tree.cpp:1040
#41 0x0000000008605c7f in SceneTree::process (this=0xd16aed0, p_time=0.13004099999999985) at ./scene/main/scene_tree.cpp:527
#42 0x0000000005b5bbeb in Main::iteration () at main/main.cpp:4053
--Type <RET> for more, q to quit, c to continue without paging--
#43 0x0000000005aa55a4 in OS_LinuxBSD::run (this=0x7fffffffd0d0) at platform/linuxbsd/os_linuxbsd.cpp:962
#44 0x0000000005a9e331 in main (argc=2, argv=0x7fffffffd728) at platform/linuxbsd/godot_linuxbsd.cpp:85

I'm not sure how to reproduce it minimally to file a bug report upstream, maybe @capnm @hermet @mgrudzinska can advise.

I tested upstream svg2png and svg2tvg and they seem to handle it fine.

On the other hand I tested https://thorvg.github.io/thorvg.viewer/ and it seems to fail handling that file, with this error:

Uncaught (in promise) RuntimeError: indirect call signature mismatch
    anonymous https://thorvg.github.io/thorvg.viewer/lottie-player.js line 1 > Function:8
    get https://thorvg.github.io/thorvg.viewer/lottie-player.js:1
    get https://thorvg.github.io/thorvg.viewer/lottie-player.js:1
    createTabs https://thorvg.github.io/thorvg.viewer/main.js:58
    onload https://thorvg.github.io/thorvg.viewer/main.js:229
    loadFile https://thorvg.github.io/thorvg.viewer/main.js:224
    fileDropOrBrowseHandle https://thorvg.github.io/thorvg.viewer/main.js:196
    initialize https://thorvg.github.io/thorvg.viewer/main.js:136
    initialize https://thorvg.github.io/thorvg.viewer/main.js:135
    onload https://thorvg.github.io/thorvg.viewer/main.js:49
    EventHandlerNonNull* https://thorvg.github.io/thorvg.viewer/main.js:45
akien-mga commented 4 months ago

Removing the embedded PNG images from the file (by manually editing it) seems to solve the crash.

mgrudzinska commented 4 months ago

I'm not sure how to reproduce it minimally to file a bug report upstream, maybe @capnm @hermet @mgrudzinska can advise.

I tested upstream svg2png and svg2tvg and they seem to handle it fine.

To reproduce the crash, one needs to use the mesh. Neither svg2png nor svg2tvg use it. If we load the image into the example Texmap.cpp, we reproduce the crash immediately.

hermet commented 3 months ago

@nongvantinh @akien-mga the crash issue will be fixed in thorvg v0.13.5. Thanks