https://bugs.kde.org/show_bug.cgi?id=492444

            Bug ID: 492444
           Summary: Trying to delete QTextEdit with
                    Sonnet::SpellCheckDecorator attached results in memory
                    corruption
    Classification: Frameworks and Libraries
           Product: frameworks-sonnet
           Version: 5.116.0
          Platform: Other
                OS: Other
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: general
          Assignee: martin.sandsm...@kde.org
          Reporter: nikolayrovinskiy...@gmail.com
                CC: kdelibs-b...@kde.org
  Target Milestone: ---

Created attachment 173160
  --> https://bugs.kde.org/attachment.cgi?id=173160&action=edit
The archive with full demo.

SUMMARY
Trying to delete QTextEdit with Sonnet::SpellCheckDecorator attached results in
memory corruption (For example please see attached demo).

STEPS TO REPRODUCE
1. Create a QWidget, which contain QTextEdit with SpellCheckDecorator and
QPushButton which calls `delete txtTarget`
2. Build an launch the application with -fsanitize=address flag.

OBSERVED RESULT
On QT 5.116.0
- Without -fsanitize=address: The application will remove text box, however,
eventually will fail in unexpected place, because the memory was corrupted.
- With -fsanitize=address: The application will fail while deleting QTextEdit,
because QTextEdit will try to remove dependent components, one of which is
SpellCheckDecorator instance, which destructor in turn, will call
m_plainTextEdit->removeEventFilter(q). But the m_plainTextEdit was already
destroyed at this time and cannot be read.

On QT 6.5.0
- Without -fsanitize=address error while calling malloc
- With -fsanitize=address: expected behavior. 

EXPECTED RESULT
The text box should be removed without error.

SOFTWARE/OS VERSIONS
Linux/KDE Plasma: 
KDE Plasma Version: 6.1.4
KDE Frameworks Version: 6.5.0
Qt Version: 5.116.0 and 6.5.0

ADDITIONAL INFORMATION
The error may be mitigated by calling
delete sonnet_instance
// Before calling
delete txtTarget
// See the commented code in 
// void MyWindow::deleteClicked() method

The error:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==8141==ERROR: AddressSanitizer: SEGV on unknown address 0x000000007bce (pc
0x7f62d54e8ff0 bp 0x7ffdd7e67e50 sp 0x7ffdd7e67e30 T0)
==8141==The signal is caused by a READ memory access.
    #0 0x7f62d54e8ff0 in QObject::removeEventFilter(QObject*)
(/lib64/libQt5Core.so.5+0x2e8ff0) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #1 0x7f62d6f0e53e in Sonnet::SpellCheckDecorator::~SpellCheckDecorator()
(/lib64/libKF5SonnetUi.so.5+0x1d53e) (BuildId:
af8eca413a253133aec773e1002b979a12a95e5f)
    #2 0x7f62d6f0e574 in Sonnet::SpellCheckDecorator::~SpellCheckDecorator()
(/lib64/libKF5SonnetUi.so.5+0x1d574) (BuildId:
af8eca413a253133aec773e1002b979a12a95e5f)
    #3 0x7f62d54e0435 in QObjectPrivate::deleteChildren()
(/lib64/libQt5Core.so.5+0x2e0435) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #4 0x7f62d61ccad1 in QWidget::~QWidget()
(/lib64/libQt5Widgets.so.5+0x1ccad1) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #5 0x7f62d636f554 in QTextEdit::~QTextEdit()
(/lib64/libQt5Widgets.so.5+0x36f554) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #6 0x403ef4 in MyWindow::deleteClicked()
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x403ef4)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)
    #7 0x404abe in QtPrivate::FunctorCall<QtPrivate::IndexesList<>,
QtPrivate::List<>, void, void (MyWindow::*)()>::call(void (MyWindow::*)(),
MyWindow*, void**)
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x404abe)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)
    #8 0x4048da in void QtPrivate::FunctionPointer<void
(MyWindow::*)()>::call<QtPrivate::List<>, void>(void (MyWindow::*)(),
MyWindow*, void**)
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x4048da)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)
    #9 0x40477b in QtPrivate::QSlotObject<void (MyWindow::*)(),
QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*,
void**, bool*)
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x40477b)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)
    #10 0x7f62d54ebf1d in void doActivate<false>(QObject*, int, void**)
(/lib64/libQt5Core.so.5+0x2ebf1d) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #11 0x7f62d628a6f3 in QAbstractButton::clicked(bool)
(/lib64/libQt5Widgets.so.5+0x28a6f3) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #12 0x7f62d628a9de in QAbstractButtonPrivate::emitClicked()
(/lib64/libQt5Widgets.so.5+0x28a9de) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #13 0x7f62d628c37e in QAbstractButtonPrivate::click()
(/lib64/libQt5Widgets.so.5+0x28c37e) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #14 0x7f62d628c5aa in QAbstractButton::mouseReleaseEvent(QMouseEvent*)
(/lib64/libQt5Widgets.so.5+0x28c5aa) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #15 0x7f62d61d1597 in QWidget::event(QEvent*)
(/lib64/libQt5Widgets.so.5+0x1d1597) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #16 0x7f62d618cc34 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
(/lib64/libQt5Widgets.so.5+0x18cc34) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #17 0x7f62d619540e in QApplication::notify(QObject*, QEvent*)
(/lib64/libQt5Widgets.so.5+0x19540e) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #18 0x7f62d54b7177 in QCoreApplication::notifyInternal2(QObject*, QEvent*)
(/lib64/libQt5Core.so.5+0x2b7177) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #19 0x7f62d619328c in QApplicationPrivate::sendMouseEvent(QWidget*,
QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool, bool)
(/lib64/libQt5Widgets.so.5+0x19328c) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #20 0x7f62d61ec006 in QWidgetWindow::handleMouseEvent(QMouseEvent*)
(/lib64/libQt5Widgets.so.5+0x1ec006) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #21 0x7f62d61ef71e in QWidgetWindow::event(QEvent*)
(/lib64/libQt5Widgets.so.5+0x1ef71e) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #22 0x7f62d618cc34 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
(/lib64/libQt5Widgets.so.5+0x18cc34) (BuildId:
7e21d3a186390804fdc5d6972a897f2a6db667a4)
    #23 0x7f62d54b7177 in QCoreApplication::notifyInternal2(QObject*, QEvent*)
(/lib64/libQt5Core.so.5+0x2b7177) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #24 0x7f62d595d3f6 in
QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*)
(/lib64/libQt5Gui.so.5+0x15d3f6) (BuildId:
c09f1fa05ff2307c0fe81246a5b9d28c64a9660b)
    #25 0x7f62d5939d5b in
QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(/lib64/libQt5Gui.so.5+0x139d5b) (BuildId:
c09f1fa05ff2307c0fe81246a5b9d28c64a9660b)
    #26 0x7f62cfdc1ba3 in userEventSourceDispatch(_GSource*, int (*)(void*),
void*) (/lib64/libQt5WaylandClient.so.5+0xb3ba3) (BuildId:
a0efeb3b2e2097819825fd38642e9eecc5eac042)
    #27 0x7f62d431ae8b in g_main_context_dispatch_unlocked.lto_priv.0
(/lib64/libglib-2.0.so.0+0x5ce8b) (BuildId:
36b60dbd02e796145a982d0151ce37202ec05649)
    #28 0x7f62d437cc97 in g_main_context_iterate_unlocked.isra.0
(/lib64/libglib-2.0.so.0+0xbec97) (BuildId:
36b60dbd02e796145a982d0151ce37202ec05649)
    #29 0x7f62d431c382 in g_main_context_iteration
(/lib64/libglib-2.0.so.0+0x5e382) (BuildId:
36b60dbd02e796145a982d0151ce37202ec05649)
    #30 0x7f62d550bbec in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(/lib64/libQt5Core.so.5+0x30bbec) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #31 0x7f62d54b5ada in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
(/lib64/libQt5Core.so.5+0x2b5ada) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #32 0x7f62d54bdf45 in QCoreApplication::exec()
(/lib64/libQt5Core.so.5+0x2bdf45) (BuildId:
cbe9627b0e3c019c0832a55096a129215d44377b)
    #33 0x404c90 in main
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x404c90)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)
    #34 0x7f62d4c39087 in __libc_start_call_main (/lib64/libc.so.6+0x2a087)
(BuildId: 77c77fee058b19c6f001cf2cb0371ce3b8341211)
    #35 0x7f62d4c3914a in __libc_start_main_alias_1 (/lib64/libc.so.6+0x2a14a)
(BuildId: 77c77fee058b19c6f001cf2cb0371ce3b8341211)
    #36 0x4032d4 in _start
(/home/user/eclipse-workspace/QtSpellCheck/build/default/QtSpellCheck+0x4032d4)
(BuildId: 8277ed9c61963add82b468c7495f7e52f07f96ee)

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to