Created attachment 144291 [details] layerstyles res test file (created in Krita 4.4.1) SUMMARY I have a file here that was made in Krita 4.4.1 for testing purposes that causes an assert when attempting to load it on branch krita/5.0 . STEPS TO REPRODUCE 1. Try opening the attached file. OBSERVED RESULT Krita throws an assert: ``` ASSERT: "parts.size() == 2" in file /home/eoin/Source/krita/src/libs/resources/KisMemoryStorage.cpp, line 284 ``` EXPECTED RESULT Should throw no asserts, and do its best to load files. ADDITIONAL INFORMATION If it's not possible to load this specific file, we will probably want to at least ensure that this type of assert doesn't happen to users during production and general use.
Here's a backtrace for full scope if necessary: #0 0x00007ffff32a2d22 in raise () at /usr/lib/libc.so.6 #1 0x00007ffff328c862 in abort () at /usr/lib/libc.so.6 #2 0x00007ffff385a94e in () at /usr/lib/libQt5Core.so.5 #3 0x00007ffff3859cd1 in qt_assert_x(char const*, char const*, char const*, int) () at /usr/lib/libQt5Core.so.5 #4 0x00007ffff5dd55a3 in KisMemoryStorage::resourceMd5(QString const&) (this=0x555556822f00, url=<optimized out>) at /home/eoin/Source/krita/src/libs/resources/KisMemoryStorage.cpp:284 #5 0x00007ffff5e09a24 in KisResourceStorage::resourceMd5(QString const&) (this=this@entry=0x55555ba0ac00, url=...) at /home/eoin/Source/krita/src/libs/resources/KisResourceStorage.cpp:197 #6 0x00007ffff5dfb844 in KisResourceLocator::addResource(QString const&, QSharedPointer<KoResource>, QString const&) (this=0x5555571bfd70, resourceType=..., resource=..., storageLocation=...) at /home/eoin/Source/krita/src/libs/resources/KisResourceLocator.cpp:483 #7 0x00007ffff5e1860e in KisAllResourcesModel::addResource(QSharedPointer<KoResource>, QString const&) (this=0x555557339100, resource=..., storageId=...) at /home/eoin/Source/krita/src/libs/resources/KisResourceModel.cpp:489 #8 0x00007ffff5e15b0d in KisResourceModel::addResource(QSharedPointer<KoResource>, QString const&) (this=this@entry=0x7fffffffbdf0, resource=..., storageId=...) at /home/eoin/Source/krita/src/libs/resources/KisResourceModel.cpp:859 #9 0x00007ffff717e8c0 in KisAslLayerStyleSerializer::assignAllLayerStylesToLayers(KisSharedPtr<KisNode>, QString const&) (this=this@entry=0x7fffffffbf80, root=..., storageLocation=...) at /home/eoin/Source/krita/src/libs/image/kis_asl_layer_style_serializer.cpp:1304 #10 0x00007fff20398e08 in KisKraLoader::loadBinaryData(KoStore*, KisSharedPtr<KisImage>, QString const&, bool) (this=this@entry=0x55555d03e630, store=store@entry=0x55555d489ba0, image=..., uri=..., external=external@entry=true) at /home/eoin/Source/krita/src/plugins/impex/libkra/kis_kra_loader.cpp:517 #11 0x00007fff203d3f90 in KraConverter::completeLoading(KoStore*) (this=0x7fffffffc290, store=0x55555d489ba0) at /home/eoin/Source/krita/src/plugins/impex/libkra/kra_converter.cpp:431 #12 0x00007fff203d51ff in KraConverter::buildImage(QIODevice*) (this=this@entry=0x7fffffffc290, io=0x7fffffffc190, io@entry=0x7fffffffc350) at /home/eoin/Source/krita/src/plugins/impex/libkra/kra_converter.cpp:106 #13 0x00007fff20577ffa in KraImport::convert(KisDocument*, QIODevice*, KisPinnedSharedPtr<KisPropertiesConfiguration>) (this=<optimized out>, document=0x55555d005590, io=0x7fffffffc350) at /home/eoin/Source/krita/src/plugins/impex/kra/kra_import.cpp:30 #14 0x00007ffff7c695a8 in KisImportExportManager::doImport(QString const&, QSharedPointer<KisImportExportFilter>) (this=0x555556208130, location=<optimized out>, filter=...) at /home/eoin/Source/krita/src/libs/ui/KisImportExportManager.cpp:665 #15 0x00007ffff7c6ad9a in KisImportExportManager::convert(KisImportExportManager::Direction, QString const&, QString const&, QString const&, bool, KisPinnedSharedPtr<KisPropertiesConfiguration>, bool, bool) (this=0x555556208130, direction=<optimized out>, location=<optimized out>, realLocation=<optimized out>, mimeType=<optimized out>, showWarnings=<optimized out>, exportConfiguration=..., isAsync=<optimized out>, isAdvancedExporting=<optimized out>) at /home/eoin/Source/krita/src/libs/ui/KisImportExportManager.cpp:373 #16 0x00007ffff7c6ba27 in KisImportExportManager::importDocument(QString const&, QString const&) (this=this@entry=0x555556208130, location=..., mimeType=...) at /home/eoin/Source/krita/src/libs/global/kis_shared_ptr.h:206 #17 0x00007ffff7c51165 in KisDocument::openFile() (this=0x55555d005590) at /home/eoin/Source/krita/src/libs/ui/KisDocument.cpp:1808 #18 0x00007ffff7c51b11 in KisDocument::openPathInternal(QString const&) (this=0x55555d005590, path=<optimized out>) at /home/eoin/Source/krita/src/libs/ui/KisDocument.cpp:2360 #19 0x00007ffff7c56bb9 in KisDocument::openPath(QString const&, QFlags<KisDocument::OpenFlag>) (this=this@entry=0x55555d005590, _path=..., flags=..., flags@entry=...) at /home/eoin/Source/krita/src/libs/ui/KisDocument.cpp:1744 #20 0x00007ffff7c7b61d in KisMainWindow::openDocumentInternal(QString const&, QFlags<KisMainWindow::OpenFlag>) (this=<optimized out>, path=..., flags=...) at /home/eoin/Source/krita/src/libs/ui/KisMainWindow.cpp:1114 #21 0x00007ffff7c7bbcd in KisMainWindow::openDocument(QString const&, QFlags<KisMainWindow::OpenFlag>) (this=0x55555775d8d0, path=..., flags=...) at /home/eoin/Source/krita/src/libs/ui/KisMainWindow.cpp:1088 #22 0x00007ffff7c7bfdd in KisMainWindow::slotFileOpen(bool) (this=0x55555775d8d0, isImporting=false) at /home/eoin/Source/krita/src/libs/ui/KisMainWindow.cpp:1731 #23 0x00007ffff3ac496b in () at /usr/lib/libQt5Core.so.5 #24 0x00007ffff4672927 in QAbstractButton::clicked(bool) () at /usr/lib/libQt5Widgets.so.5 #25 0x00007ffff4672bd0 in () at /usr/lib/libQt5Widgets.so.5 #26 0x00007ffff4674868 in () at /usr/lib/libQt5Widgets.so.5 #27 0x00007ffff4674a99 in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () at /usr/lib/libQt5Widgets.so.5 #28 0x00007ffff45bcfce in QWidget::event(QEvent*) () at /usr/lib/libQt5Widgets.so.5 #29 0x00007ffff4578ff6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5 #30 0x00007ffff4580e59 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5 #31 0x00007ffff7c3867b in KisApplication::notify(QObject*, QEvent*) (this=0x7fffffffdc40, receiver=<optimized out>, event=0x7fffffffd350) at /home/eoin/Source/krita/src/libs/ui/KisApplication.cpp:767 #32 0x00007ffff3a8d20a in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5 #33 0x00007ffff457f8ff in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool) () at /usr/lib/libQt5Widgets.so.5 #34 0x00007ffff45d6e98 in () at /usr/lib/libQt5Widgets.so.5 #35 0x00007ffff45da215 in () at /usr/lib/libQt5Widgets.so.5 #36 0x00007ffff4578ff6 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5 --Type <RET> for more, q to quit, c to continue without paging-- #37 0x00007ffff7c3867b in KisApplication::notify(QObject*, QEvent*) (this=0x7fffffffdc40, receiver=<optimized out>, event=0x7fffffffd700) at /home/eoin/Source/krita/src/libs/ui/KisApplication.cpp:767 #38 0x00007ffff3a8d20a in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5 #39 0x00007ffff3e6bc50 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /usr/lib/libQt5Gui.so.5 #40 0x00007ffff3e40b15 in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Gui.so.5 #41 0x00007fffef2dd800 in () at /usr/lib/libQt5XcbQpa.so.5 #42 0x00007ffff1ec04dc in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0 #43 0x00007ffff1f14799 in () at /usr/lib/libglib-2.0.so.0 #44 0x00007ffff1ebdbc1 in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0 #45 0x00007ffff3ae6b2a in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5 #46 0x00007ffff3a8babb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5 #47 0x00007ffff3a942a8 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5 #48 0x000055555555c67d in main(int, char**) (argc=<optimized out>, argv=0x7fffffffdc90) at /home/eoin/Source/krita/src/krita/main.cc:694
So, you should first investigate what the value of the url parameter is: why there isn't a slash in there.
The problem here is that the gradient loaded from the layer style has no filename attached...
Okay, I was very correct, the gradient's filename is not null, but is a bit... long ;) "/var/home/emmet/.local/share/krita/gradients/.svg.ggr"
A possibly relevant merge request was started @ https://invent.kde.org/graphics/krita/-/merge_requests/1214
Git commit 5b488f0b23280b9b106c8dede4b3b28e4334ca58 by Dmitry Kazakov. Committed on 09/12/2021 at 13:13. Pushed by dkazakov into branch 'master'. [not for 5.0] Add a sanity check for KoResource filename The resource filenames in Krita 5.x cannot have slashes inside, that is, they should be "file names", not "file paths". That is quite a dramatic change that happened during 4.x->5.x transition. And some of our code that loads the embedded resources can still initialize the resource with the full file path. This patch adds a sanity check into KoResource to catch this case earlier. M +6 -0 libs/resources/KoResource.cpp https://invent.kde.org/graphics/krita/commit/5b488f0b23280b9b106c8dede4b3b28e4334ca58
Git commit 615a4e9a00967bde6b0b688c31fbe1776ece7658 by Dmitry Kazakov. Committed on 09/12/2021 at 13:13. Pushed by dkazakov into branch 'master'. Fix an assert when loading a layer style from Krita 4.x days The filename of a resource in Krita cannot have slashes inside, because it confuses storages. And gradients created in Krita 4.x and embedded into ASL could have full path in their filename. In this particular case we can just safely convert the filename, since it is not used for addressing in ASL. M +12 -1 libs/psdutils/asl/kis_asl_xml_parser.cpp https://invent.kde.org/graphics/krita/commit/615a4e9a00967bde6b0b688c31fbe1776ece7658
Git commit 162344b936b6e73f52ed462abe2f6c51efdfb100 by Dmitry Kazakov. Committed on 09/12/2021 at 13:25. Pushed by dkazakov into branch 'krita/5.0'. Fix an assert when loading a layer style from Krita 4.x days The filename of a resource in Krita cannot have slashes inside, because it confuses storages. And gradients created in Krita 4.x and embedded into ASL could have full path in their filename. In this particular case we can just safely convert the filename, since it is not used for addressing in ASL. M +12 -1 libs/psd/asl/kis_asl_xml_parser.cpp https://invent.kde.org/graphics/krita/commit/162344b936b6e73f52ed462abe2f6c51efdfb100