Summary: | kmail crash when removing a line in the editor | ||
---|---|---|---|
Product: | [Unmaintained] kdelibs | Reporter: | Olivier Goffart <ogoffart> |
Component: | qt | Assignee: | kdelibs bugs <kdelibs-bugs-null> |
Status: | RESOLVED FIXED | ||
Severity: | crash | CC: | info |
Priority: | NOR | ||
Version First Reported In: | unspecified | ||
Target Milestone: | --- | ||
Platform: | unspecified | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | Qt-only test case |
Description
Olivier Goffart
2006-08-16 18:37:09 UTC
This happens because QTextParagraph::join() deletes the paragraph it joins with while that paragraph is still referenced by QTextDocuments and QTextCursors all over the place. It is a Qt bug, and I have no idea what to do about it. If this problem can be reproduced with Qt's QTextEdit example then report it to qt-bugs@trolltech.com. Otherwise, it's probably us doing things in KMEdit or KEdit we shouldn't do. Easily reproduced in Qt3's examples/textedit/ ==369== Invalid read of size 1 ==369== at 0x4FDA372: QTextParagraph::document() const (qrichtext_p.h:1190) ==369== by 0x4FEB2A2: QTextCursor::gotoPosition(QTextParagraph*, int) (qrichtext_p.cpp:144) ==369== by 0x4FE4CB9: QTextCursor::setParagraph(QTextParagraph*) (qrichtext_p.h:324) ==369== by 0x4FD917A: QTextDeleteCommand::unexecute(QTextCursor*) (qrichtext.cpp:246) ==369== by 0x4FA4944: QTextCommandHistory::undo(QTextCursor*) (qrichtext.cpp:147) ==369== by 0x4FA49F7: QTextDocument::undo(QTextCursor*) (qrichtext.cpp:2999) ==369== by 0x51069B9: QTextEdit::undo() (qtextedit.cpp:3200) ==369== by 0x510C9BC: QTextEdit::keyPressEvent(QKeyEvent*) (qtextedit.cpp:1520) ==369== by 0x4F8A1AD: QWidget::event(QEvent*) (qwidget.cpp:4723) ==369== by 0x5103C89: QTextEdit::event(QEvent*) (qtextedit.cpp:1205) ==369== by 0x4ED7BA1: QApplication::internalNotify(QObject*, QEvent*) (qapplication.cpp:2635) ==369== by 0x4ED9CAE: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:2392) ==369== Address 0x75C2541 is 49 bytes inside a block of size 152 free'd ==369== at 0x4A21FE9: operator delete(void*) (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so) ==369== by 0x4FCB01C: QTextParagraph::join(QTextParagraph*) (qrichtext.cpp:4233) ==369== by 0x4FCB597: QTextDocument::removeSelectedText(int, QTextCursor*) (qrichtext.cpp:2965) ==369== by 0x4FCB7E6: QTextDeleteCommand::execute(QTextCursor*) (qrichtext.cpp:228) ==369== by 0x4FA4807: QTextCommandHistory::redo(QTextCursor*) (qrichtext.cpp:159) ==369== by 0x4FA48FD: QTextDocument::redo(QTextCursor*) (qrichtext.cpp:3004) ==369== by 0x51067C7: QTextEdit::redo() (qtextedit.cpp:3251) ==369== by 0x510C99E: QTextEdit::keyPressEvent(QKeyEvent*) (qtextedit.cpp:1518) ==369== by 0x4F8A1AD: QWidget::event(QEvent*) (qwidget.cpp:4723) ==369== by 0x5103C89: QTextEdit::event(QEvent*) (qtextedit.cpp:1205) ==369== by 0x4ED7BA1: QApplication::internalNotify(QObject*, QEvent*) (qapplication.cpp:2635) ==369== by 0x4ED9CAE: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:2392) ==369== ==369== Invalid read of size 8 ==369== at 0x4FDA381: QTextParagraph::document() const (qrichtext_p.h:1190) ==369== by 0x4FEB2A2: QTextCursor::gotoPosition(QTextParagraph*, int) (qrichtext_p.cpp:144) ==369== by 0x4FE4CB9: QTextCursor::setParagraph(QTextParagraph*) (qrichtext_p.h:324) ==369== by 0x4FD917A: QTextDeleteCommand::unexecute(QTextCursor*) (qrichtext.cpp:246) ==369== by 0x4FA4944: QTextCommandHistory::undo(QTextCursor*) (qrichtext.cpp:147) ==369== by 0x4FA49F7: QTextDocument::undo(QTextCursor*) (qrichtext.cpp:2999) ==369== by 0x51069B9: QTextEdit::undo() (qtextedit.cpp:3200) ==369== by 0x510C9BC: QTextEdit::keyPressEvent(QKeyEvent*) (qtextedit.cpp:1520) ==369== by 0x4F8A1AD: QWidget::event(QEvent*) (qwidget.cpp:4723) ==369== by 0x5103C89: QTextEdit::event(QEvent*) (qtextedit.cpp:1205) ==369== by 0x4ED7BA1: QApplication::internalNotify(QObject*, QEvent*) (qapplication.cpp:2635) ==369== by 0x4ED9CAE: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:2392) ==369== Address 0x75C2538 is 40 bytes inside a block of size 152 free'd ==369== at 0x4A21FE9: operator delete(void*) (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so) ==369== by 0x4FCB01C: QTextParagraph::join(QTextParagraph*) (qrichtext.cpp:4233) ==369== by 0x4FCB597: QTextDocument::removeSelectedText(int, QTextCursor*) (qrichtext.cpp:2965) ==369== by 0x4FCB7E6: QTextDeleteCommand::execute(QTextCursor*) (qrichtext.cpp:228) ==369== by 0x4FA4807: QTextCommandHistory::redo(QTextCursor*) (qrichtext.cpp:159) ==369== by 0x4FA48FD: QTextDocument::redo(QTextCursor*) (qrichtext.cpp:3004) ==369== by 0x51067C7: QTextEdit::redo() (qtextedit.cpp:3251) ==369== by 0x510C99E: QTextEdit::keyPressEvent(QKeyEvent*) (qtextedit.cpp:1518) ==369== by 0x4F8A1AD: QWidget::event(QEvent*) (qwidget.cpp:4723) ==369== by 0x5103C89: QTextEdit::event(QEvent*) (qtextedit.cpp:1205) ==369== by 0x4ED7BA1: QApplication::internalNotify(QObject*, QEvent*) (qapplication.cpp:2635) ==369== by 0x4ED9CAE: QApplication::notify(QObject*, QEvent*) (qapplication.cpp:2392) Great. Then please send a bug report to the trolls. I'll reassign the bug. Reported to Trolltech, TT ID 127520. Note that I can't reproduce the problem anymore. It's misteriously gone, and I did not do something special. Created attachment 17529 [details]
Qt-only test case
A small Qt-only test application to demonstrate the crash.
The Qt bug is fixed and i have not been able to reprocude for age anyway... |