Bug 389067

Summary: Python Creation of FileLayer Causes Crash
Product: [Applications] krita Reporter: veeedjo
Component: ScriptingAssignee: Krita Bugs <krita-bugs-null>
Status: RESOLVED FIXED    
Severity: critical CC: halla
Priority: NOR    
Version First Reported In: 4.0.0-beta.1   
Target Milestone: ---   
Platform: Manjaro   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:

Description veeedjo 2018-01-16 20:03:24 UTC
Crashes when creating file layers via Python.

Example:

document = kritaInstance.activeDocument()
file_layer = document.createFileLayer("MyFileLayer", "/home/jesse/Picture/test.png", "None")
root_node = document.rootNode()
new_list = root_node.childNodes()
new_list.append(file_layer)
root_node.setChildNodes(new_list)

This crashes. I also tried various other ways of setting the child node tree, like instead of calling setChildNodes(). I also tried creating a Node of type "filelayer". That crashes as well.

Think it may have something to do with the path that is being generated during FileLayer creation.
Comment 1 Halla Rempt 2018-01-17 10:34:49 UTC
I can confirm the crash:

Thread 1 (Thread 0x7f9b8c0b8940 (LWP 23808)):
[KCrash Handler]
#6  KisPaintDevice::extent (this=0x0) at /home/boud/dev/krita/libs/image/kis_paint_device.cc:1178
#7  0x00007f9b8b788c26 in KisFileLayer::slotLoadingFinished (this=0x13f27d40, projection=..., xRes=99, yRes=99) at /home/boud/dev/krita/libs/ui/kis_file_layer.cpp:180
#8  0x00007f9b8ba6978a in KisFileLayer::qt_static_metacall (_o=<optimized out>, _c=<optimized out>, _id=<optimized out>, _a=<optimized out>) at /home/boud/dev/b-krita/libs/ui/moc_kis_file_layer.cpp:76
#9  0x00007f9b8173e1df in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib64/libQt5Core.so.5
#10 0x00007f9b8ba62641 in KisSafeDocumentLoader::loadingFinished (this=this@entry=0x13f27d98, _t1=..., _t2=99, _t3=_t3@entry=99) at /home/boud/dev/b-krita/libs/ui/moc_kis_safe_document_loader.cpp:154
#11 0x00007f9b8b78c48e in KisSafeDocumentLoader::delayedLoadStart (this=this@entry=0x13f27d98) at /home/boud/dev/krita/libs/ui/kis_safe_document_loader.cpp:240
#12 0x00007f9b8b78cca7 in KisSafeDocumentLoader::fileChangedCompressed (this=this@entry=0x13f27d98, sync=sync@entry=true) at /home/boud/dev/krita/libs/ui/kis_safe_document_loader.cpp:201
#13 0x00007f9b8b78cdfa in KisSafeDocumentLoader::reloadImage (this=this@entry=0x13f27d98) at /home/boud/dev/krita/libs/ui/kis_safe_document_loader.cpp:157
#14 0x00007f9b8b78884b in KisFileLayer::setFileName (this=this@entry=0x13f27d40, basePath=..., filename=...) at /home/boud/dev/krita/libs/ui/kis_file_layer.cpp:135
#15 0x00007f9b4d692f90 in FileLayer::FileLayer (this=0x22a7ec0, image=..., name=..., baseName=..., fileName=..., scalingMethod=..., parent=0x0) at /home/boud/dev/krita/libs/libkis/FileLayer.cpp:35
#16 0x00007f9b4d6669fb in Document::createFileLayer (this=this@entry=0x1458a060, name=..., FileName=..., ScalingMethod=...) at /home/boud/dev/krita/libs/libkis/Document.cpp:600
#17 0x00007f9b4d69c3ca in Document::qt_static_metacall (_o=0x1458a060, _c=<optimized out>, _id=<optimized out>, _a=0x7ffc52946580) at /home/boud/dev/b-krita/libs/libkis/moc_Document.cpp:429
#18 0x00007f9b81720075 in QMetaMethod::invoke(QObject*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument) const () from /usr/lib64/libQt5Core.so.5
#19 0x00007f9b4c8bb1aa in QMetaMethod::invoke (val9=..., val8=..., val7=..., val6=..., val5=..., val4=..., val3=..., val2=..., val1=..., val0=..., returnValue=..., object=<optimized out>, this=0x7ffc52946710) at /usr/include/qt5/QtCore/qmetaobject.h:107
#20 pyqtMethodProxy_call (self=0x7f9b45797fd0, args=0x7f9b6dba15a0, kw_args=<optimized out>) at ../../qpy/QtCore/qpycore_pyqtmethodproxy.cpp:211
#21 0x00007f9b4d998eca in PyObject_Call () from /usr/lib64/libpython3.4m.so.1.0
#22 0x00007f9b4d9bbac8 in PyEval_EvalFrameEx () from /usr/lib64/libpython3.4m.so.1.0
#23 0x00007f9b4d9c1670 in PyEval_EvalCodeEx () from /usr/lib64/libpython3.4m.so.1.0
#24 0x00007f9b4da064db in PyEval_EvalCode () from /usr/lib64/libpython3.4m.so.1.0
#25 0x00007f9b4da11b00 in ?? () from /usr/lib64/libpython3.4m.so.1.0
#26 0x00007f9b4da12145 in PyRun_StringFlags () from /usr/lib64/libpython3.4m.so.1.0
#27 0x00007f9b4da0536c in ?? () from /usr/lib64/libpython3.4m.so.1.0
#28 0x00007f9b4d9bbd5c in PyEval_EvalFrameEx () from /usr/lib64/libpython3.4m.so.1.0
#29 0x00007f9b4d9c1670 in PyEval_EvalCodeEx () from /usr/lib64/libpython3.4m.so.1.0
#30 0x00007f9b4d99ce68 in ?? () from /usr/lib64/libpython3.4m.so.1.0
#31 0x00007f9b4d998eca in PyObject_Call () from /usr/lib64/libpython3.4m.so.1.0
#32 0x00007f9b4d99a30a in ?? () from /usr/lib64/libpython3.4m.so.1.0
#33 0x00007f9b4d998eca in PyObject_Call () from /usr/lib64/libpython3.4m.so.1.0
#34 0x00007f9b4d9b79c6 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython3.4m.so.1.0
#35 0x00007f9b4c8bd4c5 in PyQtSlot::call (this=this@entry=0x142add60, callable=callable@entry=0x7f9b4d3ac988, args=args@entry=0x7f9b4d2f2be0) at ../../qpy/QtCore/qpycore_pyqtslot.cpp:247
#36 0x00007f9b4c8bd9d0 in PyQtSlot::invoke (this=0x142add60, qargs=<optimized out>, qargs@entry=0x7ffc52947270, self=<optimized out>, self@entry=0x0, result=result@entry=0x0, no_receiver_check=<optimized out>) at ../../qpy/QtCore/qpycore_pyqtslot.cpp:159
#37 0x00007f9b4c8bdb5d in PyQtSlot::invoke (this=<optimized out>, qargs=qargs@entry=0x7ffc52947270, no_receiver_check=<optimized out>) at ../../qpy/QtCore/qpycore_pyqtslot.cpp:78
#38 0x00007f9b4c8bdc4b in PyQtSlotProxy::unislot (this=0x11f89c60, qargs=0x7ffc52947270) at ../../qpy/QtCore/qpycore_pyqtslotproxy.cpp:205
#39 0x00007f9b4c8bead7 in PyQtSlotProxy::qt_metacall (this=0x11f89c60, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7ffc52947270) at ../../qpy/QtCore/qpycore_pyqtslotproxy.cpp:170
#40 0x00007f9b8173e804 in QMetaObject::activate(QObject*, int, int, void**) () from /usr/lib64/libQt5Core.so.5
#41 0x00007f9b8264a8f2 in QAction::triggered(bool) () from /usr/lib64/libQt5Widgets.so.5
#42 0x00007f9b8264d05d in QAction::activate(QAction::ActionEvent) () from /usr/lib64/libQt5Widgets.so.5
#43 0x00007f9b8274241d in ?? () from /usr/lib64/libQt5Widgets.so.5
#44 0x00007f9b82742554 in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib64/libQt5Widgets.so.5
#45 0x00007f9b8281168a in QToolButton::mouseReleaseEvent(QMouseEvent*) () from /usr/lib64/libQt5Widgets.so.5
#46 0x00007f9b8268c5b7 in QWidget::event(QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#47 0x00007f9b82811769 in QToolButton::event(QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#48 0x00007f9b82650cbc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#49 0x00007f9b826580ac in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#50 0x00007f9b8b9a2987 in KisApplication::notify (this=<optimized out>, receiver=0x1bb82e20, event=0x7ffc529477f0) at /home/boud/dev/krita/libs/ui/KisApplication.cpp:600
#51 0x00007f9b81714d25 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib64/libQt5Core.so.5
#52 0x00007f9b82656f29 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () from /usr/lib64/libQt5Widgets.so.5
#53 0x00007f9b826a4cf1 in ?? () from /usr/lib64/libQt5Widgets.so.5
#54 0x00007f9b826a7253 in ?? () from /usr/lib64/libQt5Widgets.so.5
#55 0x00007f9b82650cbc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#56 0x00007f9b82657a10 in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/libQt5Widgets.so.5
#57 0x00007f9b8b9a2987 in KisApplication::notify (this=<optimized out>, receiver=0x126569e0, event=0x7ffc52947cb0) at /home/boud/dev/krita/libs/ui/KisApplication.cpp:600
#58 0x00007f9b81714d25 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /usr/lib64/libQt5Core.so.5
#59 0x00007f9b81cd880d in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () from /usr/lib64/libQt5Gui.so.5
#60 0x00007f9b81cda3c5 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () from /usr/lib64/libQt5Gui.so.5
#61 0x00007f9b81cb88ab in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQt5Gui.so.5
#62 0x00007f9b75ba25b0 in ?? () from /usr/lib64/libQt5XcbQpa.so.5
#63 0x00007f9b7cb1a134 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
#64 0x00007f9b7cb1a388 in ?? () from /usr/lib64/libglib-2.0.so.0
#65 0x00007f9b7cb1a42c in g_main_context_iteration () from /usr/lib64/libglib-2.0.so.0
#66 0x00007f9b81765dbc in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQt5Core.so.5
#67 0x00007f9b8171301b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/libQt5Core.so.5
#68 0x00007f9b8171b5e4 in QCoreApplication::exec() () from /usr/lib64/libQt5Core.so.5
#69 0x00000000004059e1 in main (argc=1, argv=<optimized out>) at /home/boud/dev/krita/krita/main.cc:306
Comment 2 Halla Rempt 2018-01-17 10:44:23 UTC
from krita import *
doc = Krita.instance().activeDocument()
fl = doc.createFileLayer("test", "~/Pictures/gfx_Pepper-and-Carrot_by-David-Revoy_E24P05.jpg", "")
root = doc.rootNode()
children = root.children()
root.addChildNode(fl, children[0])
Comment 3 Halla Rempt 2018-01-17 10:57:22 UTC
Git commit 562fd25ec9fa78b8fc704969cf865b0276b211f9 by Boudewijn Rempt.
Committed on 17/01/2018 at 10:56.
Pushed by rempt into branch 'master'.

Create an initial paint device in all KisFileLayer constructors

Tested with:

from krita import *
doc = Krita.instance().activeDocument()
fl = doc.createFileLayer("test", "/home/boud/Pictures/gfx_Pepper-and-Carrot_by-David-Revoy_E24P05.jpg", "")
root = doc.rootNode()
children = root.childNodes()
root.addChildNode(fl, children[0])

M  +11   -3    libs/ui/kis_file_layer.cpp

https://commits.kde.org/krita/562fd25ec9fa78b8fc704969cf865b0276b211f9