Bug 457688 - Crash after a safe assert in tile_hash_table on adding a Filter Mask to a layer
Summary: Crash after a safe assert in tile_hash_table on adding a Filter Mask to a layer
Status: RESOLVED FIXED
Alias: None
Product: krita
Classification: Applications
Component: Layer Stack (show other bugs)
Version: git master (please specify the git hash!)
Platform: Mint (Ubuntu based) Linux
: NOR crash
Target Milestone: ---
Assignee: Tiar
URL:
Keywords: regression, release_blocker
Depends on:
Blocks:
 
Reported: 2022-08-09 17:58 UTC by Tiar
Modified: 2022-08-12 11:00 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments
Test file (1.88 MB, image/openraster)
2022-08-09 18:00 UTC, Tiar
Details
Safe assert log (10.39 KB, text/plain)
2022-08-09 18:01 UTC, Tiar
Details
Crash log file (6.49 KB, text/plain)
2022-08-09 18:02 UTC, Tiar
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Tiar 2022-08-09 17:58:54 UTC
SUMMARY
Safe assert occured when I tried to add a filter as a mask to a layer.
If you ignore the safe assert, it will appear again and again and then Krita will crash.

STEPS TO REPRODUCE
1. Open the test file provided.
2. Go to "Filter -> Adjust -> Color Adjustment Curves"
3. Press "Create Filter Mask"

OBSERVED RESULT
4. Safe assert:
    m_image KisImage(0x555557075540, name = "OpenRaster Image (name)")
    QPaintDevice: Cannot destroy paint device that is being painted
    SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151

5. If you ignore the safe assert in the dev build, you'll get it a few more times, and then eventually a crash:
Thread 1 "krita" received signal SIGSEGV, Segmentation fault.
0x00007ffff6211a26 in QPlatformPixmap::mask() const () from /lib/x86_64-linux-gnu/libQt5Gui.so.5

EXPECTED RESULT
No safe assert.
No crash after ignoring safe asserts.

SOFTWARE/OS VERSIONS
Krita

 Version: 5.2.0-prealpha (git e13edec3dc)
 Hidpi: true

Qt

  Version (compiled): 5.12.8
  Version (loaded): 5.12.8

OS Information

  Build ABI: x86_64-little_endian-lp64
  Build CPU: x86_64
  CPU: x86_64
  Kernel Type: linux
  Kernel Version: 5.13.0-35-generic
  Pretty Productname: Linux Mint 20.3
  Product Type: linuxmint
  Product Version: 20.3
  Desktop: X-Cinnamon

SAFE ASSERT LOG (shortened):
m_image KisImage(0x555557075540, name = "OpenRaster Image (name)")
QPaintDevice: Cannot destroy paint device that is being painted
SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151

Thread 1 "krita" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50	../sysdeps/unix/sysv/linux/raise.c: Nie ma takiego pliku ani katalogu.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff5748859 in __GI_abort () at abort.c:79
#2  0x00007ffff5b9caad in  () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#3  0x00007ffff6d5bf64 in kis_assert_common(char const*, char const*, int, bool, bool) (assertion=<optimized out>, file=<optimized out>, line=<optimized out>, throwException=<optimized out>, isIgnorable=<optimized out>)
    at /usr/include/x86_64-linux-gnu/qt5/QtCore/qarraydata.h:208
#4  0x00007ffff70d4eb8 in KisTileHashTableTraits2<KisTile>::calculateHashSafe(int, int) (col=-16777216, row=-16777216, this=<optimized out>) at /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h:149
#5  KisTileHashTableTraits2<KisTile>::calculateHashSafe(int, int) (this=0x555558cf6ea0, row=-16777216, col=-16777216) at /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h:149
#6  KisTileHashTableTraits2<KisTile>::getReadOnlyTileLazy(int, int, bool&) (this=0x555558cf6ea0, col=col@entry=-16777216, row=row@entry=-16777216, existingTile=@0x7fffffffb940: 32)
    at /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h:406
#7  0x00007ffff70eb0e1 in KisTiledDataManager::getTile(int, int, bool) (writable=<optimized out>, row=-16777216, col=-16777216, this=0x55555e2d7ca0) at /home/tymon/kritadev/krita/libs/image/tiles3/kis_tiled_data_manager.h:116
#8  KisTiledDataManager::getTilesPair(int, int, bool, KisSharedPtr<KisTile>*, KisSharedPtr<KisTile>*) (oldTile=0x555563893ed8, tile=0x555563893ed0, writable=<optimized out>, row=-16777216, col=-16777216, this=0x55555e2d7ca0)
    at /home/tymon/kritadev/krita/libs/image/tiles3/kis_tiled_data_manager.h:95
#9  KisRandomAccessor2::fetchTileData(int, int) (this=0x555565f4b9f0, col=-16777216, row=-16777216) at /home/tymon/kritadev/krita/libs/image/tiles3/kis_random_accessor.cc:113
#10 0x00007ffff70eb486 in KisRandomAccessor2::moveTo(int, int) (this=0x555565f4b9f0, x=-1073741824, y=-1073741824) at /home/tymon/kritadev/krita/libs/image/tiles3/kis_random_accessor.cc:80
#11 0x00007ffff72d9a5f in createThumbnailDeviceInternal(KisPaintDevice const*, qint32, qint32, qint32, qint32, qint32, qint32, QRect)
    (srcDev=<optimized out>, srcX0=-1073741824, srcY0=-1073741824, srcWidth=2147483647, srcHeight=2147483647, w=62, h=62, outputRect=...) at /home/tymon/kritadev/krita/libs/image/kis_paint_device.cc:1714


CRASH LOG (shortened):
m_image KisImage(0x55555938ebc0, name = "OpenRaster Image (name)")
SAFE ASSERT (krita): "dst->lodData->levelOfDetail() == defaultBounds->currentLevelOfDetail()" in file /home/tymon/kritadev/krita/libs/image/kis_paint_device.cc, line 852
SAFE ASSERT (krita): "dst->lodData->levelOfDetail() == defaultBounds->currentLevelOfDetail()" in file /home/tymon/kritadev/krita/libs/image/kis_paint_device.cc, line 852
QPaintDevice: Cannot destroy paint device that is being painted
SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151
SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151
SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151
SAFE ASSERT (krita): "qAbs(row) < 0x7FFF && qAbs(col) < 0x7FFF" in file /home/tymon/kritadev/krita/libs/image/tiles3/kis_tile_hash_table2.h, line 151

Thread 1 "krita" received signal SIGSEGV, Segmentation fault.
0x00007ffff6211a26 in QPlatformPixmap::mask() const () from /lib/x86_64-linux-gnu/libQt5Gui.so.5
(gdb) bt
#0  0x00007ffff6211a26 in QPlatformPixmap::mask() const () at /lib/x86_64-linux-gnu/libQt5Gui.so.5
#1  0x00007ffff6414c0a in QPainter::setBrushOrigin(QPointF const&) () at /lib/x86_64-linux-gnu/libQt5Gui.so.5
#2  0x00007fffd1ed62f5 in QPainter::setBrushOrigin(QPoint const&) (p=<synthetic pointer>..., this=0x7fffffffc6b8) at /usr/include/x86_64-linux-gnu/qt5/QtCore/qpoint.h:131
#3  NodeDelegate::drawThumbnail(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const (this=0x55555a3d6ad0, p=0x7fffffffc6b8, option=..., index=...)
    at /home/tymon/kritadev/krita/plugins/dockers/layerdocker/NodeDelegate.cpp:307
#4  0x00007fffd1eddfc3 in NodeDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const (this=0x55555a3d6ad0, p=0x7fffffffc6b8, o=..., index=...)
    at /home/tymon/kritadev/krita/plugins/dockers/layerdocker/NodeDelegate.cpp:134
#5  0x00007ffff6a8d56a in QTreeView::drawRow(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const () at /lib/x86_64-linux-gnu/libQt5Widgets.so.5
#6  0x00007ffff6a92a83 in QTreeView::drawTree(QPainter*, QRegion const&) const () at /lib/x86_64-linux-gnu/libQt5Widgets.so.5
Comment 1 Tiar 2022-08-09 18:00:47 UTC
Created attachment 151199 [details]
Test file
Comment 2 Tiar 2022-08-09 18:01:24 UTC
Created attachment 151200 [details]
Safe assert log
Comment 3 Tiar 2022-08-09 18:02:30 UTC
Created attachment 151201 [details]
Crash log file
Comment 4 Dmitry Kazakov 2022-08-12 10:12:46 UTC
Git commit 547880fd83246c345942966134d237f4b76e28a2 by Dmitry Kazakov.
Committed on 12/08/2022 at 10:12.
Pushed by dkazakov into branch 'master'.

Fix a crash when opening an ORA file

One paint device cannot belong to two different images. When one
of the images is destroyed, the default bounds link of the paint device
is destroyed.

M  +1    -1    plugins/impex/ora/kis_open_raster_stack_load_visitor.cpp

https://invent.kde.org/graphics/krita/commit/547880fd83246c345942966134d237f4b76e28a2
Comment 5 Dmitry Kazakov 2022-08-12 10:12:57 UTC
Git commit 8525135cbab7f21048ca54f43cf2e745a013944a by Dmitry Kazakov.
Committed on 12/08/2022 at 10:12.
Pushed by dkazakov into branch 'krita/5.1'.

Fix a crash when opening an ORA file

One paint device cannot belong to two different images. When one
of the images is destroyed, the default bounds link of the paint device
is destroyed.

M  +1    -1    plugins/impex/ora/kis_open_raster_stack_load_visitor.cpp

https://invent.kde.org/graphics/krita/commit/8525135cbab7f21048ca54f43cf2e745a013944a
Comment 6 Dmitry Kazakov 2022-08-12 11:00:49 UTC
Git commit 8187126ec1e1076bd3dbe6eb31678da41f881661 by Dmitry Kazakov.
Committed on 12/08/2022 at 11:00.
Pushed by dkazakov into branch 'master'.

Add a sanity check that verifies that a paint device belongs only to one layer

M  +1    -0    libs/image/kis_paint_device.cc
M  +7    -13   libs/image/kis_paint_layer.cc
M  +0    -2    libs/image/kis_paint_layer.h

https://invent.kde.org/graphics/krita/commit/8187126ec1e1076bd3dbe6eb31678da41f881661