Bug 470084

Summary: Assertion error in LcmsColorSpace.h, line 273 when opening PSD
Product: [Applications] krita Reporter: Linus Kardell <linus.kardell>
Component: GeneralAssignee: Dmitry Kazakov <dimula73>
Status: RESOLVED FIXED    
Severity: crash CC: dimula73
Priority: NOR Keywords: drkonqi
Version First Reported In: 5.1.5   
Target Milestone: ---   
Platform: openSUSE   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:

Description Linus Kardell 2023-05-21 13:18:53 UTC
Application: krita (5.1.5)

Qt Version: 5.15.9
Frameworks Version: 5.105.0
Operating System: Linux 6.3.1-1-default x86_64
Windowing System: X11
Distribution: "openSUSE Tumbleweed"
DrKonqi: 5.27.4 [KCrashBackend]

-- Information about the crash:
When I open a specific PSD file, Krita instantly crashes with an assertion error. Same result both with the OpenSUSE Tumbleweed packages and the Flathub version.

Operating System: openSUSE Tumbleweed 20230510
KDE Plasma Version: 5.27.4
KDE Frameworks Version: 5.105.0
Qt Version: 5.15.9
Kernel Version: 6.3.1-1-default (64-bit)
Graphics Platform: X11
Processors: 16 × AMD Ryzen 7 5800X 8-Core Processor
Memory: 62.7 Gibyte of RAM
Graphics Processor: NVIDIA GeForce RTX 2080 Ti/PCIe/SSE2
Manufacturer: ASUS

The crash can be reproduced every time.

-- Backtrace:
Application: Krita (krita), signal: Aborted

[KCrash Handler]
#4  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
#5  0x00007f989ea94993 in __pthread_kill_internal (signo=6, threadid=<optimized out>) at pthread_kill.c:78
#6  0x00007f989ea43196 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#7  0x00007f989ea2b897 in __GI_abort () at abort.c:79
#8  0x00007f989f0bb4e9 in qt_message_fatal (message=<synthetic pointer>..., context=...) at global/qlogging.cpp:1914
#9  QMessageLogger::fatal (this=this@entry=0x7fff14b00af0, msg=msg@entry=0x7f98a0bef0df "%s") at global/qlogging.cpp:893
#10 0x00007f98a0beb670 in kis_assert_common(char const*, char const*, int, bool, bool) [clone .isra.0] (assertion=assertion@entry=0x7f986652aca0 "d->defaultTransformations && d->defaultTransformations->fromRGB", file=file@entry=0x7f98665255c8 "/home/abuild/rpmbuild/BUILD/krita-5.1.5/plugins/color/lcms2engine/LcmsColorSpace.h", line=line@entry=273, isIgnorable=isIgnorable@entry=false, throwException=<optimized out>) at /usr/src/debug/krita-5.1.5/libs/global/kis_assert.cpp:89
#11 0x00007f98a0bb2f37 in kis_assert_exception (assertion=assertion@entry=0x7f986652aca0 "d->defaultTransformations && d->defaultTransformations->fromRGB", file=file@entry=0x7f98665255c8 "/home/abuild/rpmbuild/BUILD/krita-5.1.5/plugins/color/lcms2engine/LcmsColorSpace.h", line=line@entry=273) at /usr/src/debug/krita-5.1.5/libs/global/kis_assert.cpp:112
#12 0x00007f9865dc27b8 in LcmsColorSpace<KoCmykU8Traits>::fromQColor (this=this@entry=0x55f63e709350, color=..., dst=dst@entry=0x55f63e735fa0 "\340\254\276\236\230\177", koprofile=koprofile@entry=0x0) at /usr/src/debug/krita-5.1.5/plugins/color/lcms2engine/LcmsColorSpace.h:273
#13 0x00007f98a0943483 in KisPaintDevice::init (this=0x55f63e735e10, colorSpace=0x55f63e709350, defaultBounds=..., parent=..., name=...) at /usr/src/debug/krita-5.1.5/libs/image/kis_paint_device.cc:1086
#14 0x00007f98a0943787 in KisPaintDevice::KisPaintDevice (this=<optimized out>, parent=..., colorSpace=<optimized out>, defaultBounds=..., name=..., this=<optimized out>, parent=..., colorSpace=<optimized out>, defaultBounds=..., name=...) at /usr/src/debug/krita-5.1.5/libs/image/kis_paint_device.cc:1066
#15 0x00007f98a08d3ab0 in KisGroupLayer::resetCache (this=0x55f63e7332e0, colorSpace=0x55f63e709350) at /usr/src/debug/krita-5.1.5/libs/image/kis_group_layer.cc:195
#16 0x00007f98a08d3d3c in KisGroupLayer::KisGroupLayer (this=<optimized out>, image=..., name=..., opacity=<optimized out>, this=<optimized out>, image=..., name=..., opacity=<optimized out>) at /usr/src/debug/krita-5.1.5/libs/image/kis_group_layer.cc:53
#17 0x00007f98a08db643 in KisImage::KisImage (this=<optimized out>, undoStore=<optimized out>, width=<optimized out>, height=<optimized out>, colorSpace=<optimized out>, name=..., this=<optimized out>, undoStore=<optimized out>, width=<optimized out>, height=<optimized out>, colorSpace=<optimized out>, name=...) at /usr/src/debug/krita-5.1.5/libs/image/kis_image.cc:285
#18 0x00007f984869d5f7 in PSDLoader::decode (this=0x7fff14b01390, io=...) at /usr/src/debug/krita-5.1.5/plugins/impex/psd/psd_loader.cpp:128
#19 0x00007f98486a1d51 in PSDLoader::buildImage (io=..., this=0x7fff14b01390) at /usr/src/debug/krita-5.1.5/plugins/impex/psd/psd_loader.cpp:432
#20 psdImport::convert (this=<optimized out>, document=0x55f63e5e0010, io=0x7fff14b01400) at /usr/src/debug/krita-5.1.5/plugins/impex/psd/psd_import.cc:29
#21 0x00007f98a1258ecd in KisImportExportManager::doImport (this=0x55f638fd2970, location=..., filter=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisImportExportManager.cpp:667
#22 0x00007f98a1255341 in KisImportExportManager::convert (this=0x55f638fd2970, direction=<optimized out>, location=..., realLocation=..., mimeType=..., showWarnings=<optimized out>, exportConfiguration=..., isAsync=<optimized out>, isAdvancedExporting=<optimized out>) at /usr/src/debug/krita-5.1.5/libs/ui/KisImportExportManager.cpp:376
#23 0x00007f98a125621a in KisImportExportManager::importDocument (this=<optimized out>, location=..., mimeType=...) at /usr/src/debug/krita-5.1.5/libs/global/kis_shared_ptr.h:206
#24 0x00007f98a1248e6f in KisDocument::openFile (this=0x55f63e5e0010) at /usr/src/debug/krita-5.1.5/libs/ui/KisDocument.cpp:1874
#25 0x00007f98a124a339 in KisDocument::openPathInternal (this=0x55f63e5e0010, path=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisDocument.cpp:2414
#26 0x00007f98a124aff9 in KisDocument::openPath (this=0x55f63e5e0010, _path=..., flags=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisDocument.cpp:1810
#27 0x00007f98a1261d58 in KisMainWindow::openDocumentInternal (this=<optimized out>, path=..., flags=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisMainWindow.cpp:1113
#28 0x00007f98a126232e in KisMainWindow::openDocument (this=0x55f638a14520, path=..., flags=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisMainWindow.cpp:1087
#29 0x00007f98a122ff1b in KisApplication::start (this=this@entry=0x7fff14b02170, args=...) at /usr/src/debug/krita-5.1.5/libs/ui/KisApplication.cpp:641
#30 0x000055f634c3d555 in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/krita-5.1.5/krita/main.cc:710
[Inferior 1 (process 29413) detached]

Reported using DrKonqi
Comment 1 Linus Kardell 2023-05-21 19:36:16 UTC
PSD triggering the bug: https://drive.google.com/file/d/19vQevCPhBG9AjErmrPw_Kt8tMYEZbyqt/view?usp=share_link
Comment 2 Dmitry Kazakov 2023-06-12 16:41:12 UTC
The crash happens because the file has a profile attached, which is "not suitable for output", which makes Krita very confused. I will check in detail tomorrow.
Comment 3 Bug Janitor Service 2023-06-16 12:20:50 UTC
A possibly relevant merge request was started @ https://invent.kde.org/graphics/krita/-/merge_requests/1827
Comment 4 Dmitry Kazakov 2023-06-16 15:31:05 UTC
Git commit 205731b2aa5ab530cbd145cb32dac4796bac23a3 by Dmitry Kazakov.
Committed on 16/06/2023 at 15:30.
Pushed by dkazakov into branch 'master'.

Fix loading PSD files with Input-class ICC profiles

We cannot use such color space for work, hence we should convert
the space into something usable on loading. The patch implements
the code that asks the user about the preferred space and then
just converts into that.

Since it is impossible to convert any color **into** this color space
the patch also implements the following:

1) All delayed-update nodes are now guaranteed not to start any
   regeneration while the image is locked. This way their job will
   **not** come before the conversion stroke.

2) There is not KoColor::createTransparent(cs) call used by the merging
   code for setting the backdrop color. Previously it used the conversion
   from QColor (sRGB), which is impossible for obvious reasons.

3) When loading a generator layer from PSD we now convert the fill-color
   into LabA-32f, if the color's color space is not appropriate. The point
   of this step: we don't convert filter's color on image color space
   conversion.

4) The patch also implements KisImportUserFeedbackInterface to ask the
   used about the decision. It is necessary to allow import-export manager
   to use asynchonous loading in the future.

M  +4    -4    libs/image/KisEncloseAndFillPainter.cpp
M  +1    -1    libs/image/floodfill/kis_scanline_fill.cpp
M  +10   -0    libs/image/generator/kis_generator_layer.cpp
M  +2    -2    libs/image/kis_image.cc
M  +1    -0    libs/image/kis_image_barrier_lock_adapter.h
M  +2    -3    libs/image/kis_paint_device.cc
M  +1    -1    libs/image/kis_pixel_selection.cpp
M  +11   -0    libs/image/kis_transform_mask.cpp
M  +1    -1    libs/image/kis_transparency_mask.cc
M  +1    -1    libs/image/lazybrush/kis_colorize_mask.cpp
M  +1    -1    libs/image/lazybrush/kis_colorize_stroke_strategy.cpp
M  +9    -0    libs/image/processing/kis_convert_color_space_processing_visitor.cpp
M  +1    -0    libs/image/processing/kis_convert_color_space_processing_visitor.h
M  +0    -1    libs/image/tests/kis_layer_style_projection_plane_test.cpp
M  +11   -0    libs/pigment/KoColor.cpp
M  +8    -0    libs/pigment/KoColor.h
M  +6    -0    libs/pigment/KoColorSpace.cpp
M  +8    -0    libs/pigment/KoColorSpace.h
M  +11   -0    libs/psd/psd_additional_layer_info_block.h
M  +3    -0    libs/ui/CMakeLists.txt
M  +10   -0    libs/ui/KisImportExportFilter.cpp
M  +3    -0    libs/ui/KisImportExportFilter.h
M  +32   -0    libs/ui/KisImportExportManager.cpp
M  +79   -0    libs/ui/KisImportExportUtils.cpp
M  +20   -0    libs/ui/KisImportExportUtils.h
A  +8    -0    libs/ui/KisImportUserFeedbackInterface.cpp     [License: GPL(v2.0+)]
A  +47   -0    libs/ui/KisImportUserFeedbackInterface.h     [License: GPL(v2.0+)]
M  +2    -2    libs/ui/actions/kis_selection_action_factories.cpp
R  +23   -0    libs/ui/dialogs/dlg_colorspaceconversion.cc [from: plugins/extensions/colorspaceconversion/dlg_colorspaceconversion.cc - 078% similarity]
R  +10   -2    libs/ui/dialogs/dlg_colorspaceconversion.h [from: plugins/extensions/colorspaceconversion/dlg_colorspaceconversion.h - 071% similarity]
M  +10   -0    libs/ui/flake/kis_shape_layer_canvas.cpp
M  +1    -1    libs/ui/flake/kis_shape_selection.cpp
R  +0    -0    libs/ui/forms/wdgconvertcolorspace.ui [from: plugins/extensions/colorspaceconversion/wdgconvertcolorspace.ui - 100% similarity]
M  +1    -1    libs/ui/tool/kis_tool_utils.cpp
M  +1    -1    plugins/dockers/advancedcolorselector/kis_color_selector_simple.cpp
M  +1    -1    plugins/dockers/advancedcolorselector/kis_color_selector_triangle.cpp
M  +1    -1    plugins/dockers/advancedcolorselector/kis_color_selector_wheel.cpp
M  +1    -2    plugins/extensions/colorspaceconversion/CMakeLists.txt
M  +5    -6    plugins/extensions/colorspaceconversion/colorspaceconversion.cc
M  +2    -2    plugins/impex/libkra/kis_kra_load_visitor.cpp
M  +1    -1    plugins/impex/psd/psd_import.cc
M  +9    -3    plugins/impex/psd/psd_loader.cpp
M  +3    -1    plugins/impex/psd/psd_loader.h
M  +1    -1    plugins/paintops/mypaint/MyPaintSurface.cpp

https://invent.kde.org/graphics/krita/-/commit/205731b2aa5ab530cbd145cb32dac4796bac23a3
Comment 5 Dmitry Kazakov 2023-06-19 09:01:46 UTC
Git commit 0789a51c0988fcfa93d6b425ccb5c5841907a7e7 by Dmitry Kazakov.
Committed on 19/06/2023 at 09:01.
Pushed by dkazakov into branch 'master'.

Add a warning to the import color space conversion dialog

M  +7    -0    libs/ui/KisImportExportUtils.cpp
M  +3    -2    libs/ui/dialogs/dlg_colorspaceconversion.cc
M  +17   -7    libs/ui/forms/wdgconvertcolorspace.ui

https://invent.kde.org/graphics/krita/-/commit/0789a51c0988fcfa93d6b425ccb5c5841907a7e7