[PATCH] Avoid crash in Konsole (TEWidget::setCursorPos)

Andras Mantia amantia at kde.org
Fri Sep 8 09:50:04 BST 2006


On Friday 08 September 2006 10:10, Andras Mantia wrote:
> and nobody did anything solving the
> problem until now, so if nobody has better idea, I would like to see
> our applications not crash, even if it's not the true fix...

I spent quite some time debugging this using gdb and valgrind, but I 
give up now. Valgrind reports:

Quanta: focusW: [NewMainWindow pointer (0xb382ad8) to widget MainWindow, 
geometry=800x600+0+39] topLevelWidget: [NewMainWindow pointer 
(0xb382ad8) to widget MainWindow, geometry=800x600+0+39] x11Display: 
0xace2ea8
==30009==
==30009== Invalid read of size 1
==30009==    at 0x8879680: QWidget::topLevelWidget() const 
(qwidget.cpp:2359)
==30009==    by 0xE58BCB5: QXIMInputContext::setMicroFocus(int, int, 
int, int, QFont*) (qximinputcontext_x11.cpp:758)
==30009==    by 0x87C89F3: QWidget::setMicroFocusHint(int, int, int, 
int, bool, QFont*) (qwidget_x11.cpp:981)
==30009==    by 0xF5C7C82: TEWidget::setCursorPos(int, int) 
(TEWidget.cpp:793)
==30009==    by 0xF5D8F79: TEmulation::showBulk() (TEmulation.cpp:471)
==30009==    by 0xF5D9027: TEmulation::setConnect(bool) 
(TEmulation.cpp:494)
==30009==    by 0xF5CF923: TEmuVt102::setConnect(bool) 
(TEmuVt102.cpp:1195)
==30009==    by 0xF5BB692: TESession::setConnect(bool) (session.cpp:352)
==30009==    by 0xF5B18DD: konsolePart::newSession() 
(konsole_part.cpp:1088)
==30009==    by 0xF5B193C: konsolePart::startProgram(QString const&, 
QStrList const&) (konsole_part.cpp:1054)
==30009==    by 0xF5AE81E: konsolePart::showShellInDir(QString const&) 
(konsole_part.cpp:1102)
==30009==    by 0xF5ADD22: konsolePart::showShell() 
(konsole_part.cpp:1117)
==30009==    by 0xF5ADD4F: konsolePart::autoShowShell() 
(konsole_part.cpp:212)
==30009==    by 0xF5B498B: konsolePart::qt_invoke(int, QUObject*) 
(konsole_part.moc:334)
==30009==    by 0x884B7AB: QObject::activate_signal(QConnectionList*, 
QUObject*) (qobject.cpp:2356)
==30009==    by 0x8B2D307: QSignal::signal(QVariant const&) 
(moc_qsignal.cpp:100)
==30009==    by 0x88642B4: QSignal::activate() (qsignal.cpp:212)
==30009==    by 0x886A8D7: QSingleShotTimer::event(QEvent*) 
(qtimer.cpp:286)
==30009==    by 0x87F4984: QApplication::internalNotify(QObject*, 
QEvent*) (qapplication.cpp:2636)
==30009==    by 0x87F55B6: QApplication::notify(QObject*, QEvent*) 
(qapplication.cpp:2359)
==30009==  Address 0x15403774 is not stack'd, malloc'd or (recently) 
free'd
==30009==
==30009== Invalid read of size 8
==30009==    at 0x887968A: QWidget::topLevelWidget() const 
(qobject.h:154)
==30009==    by 0xE58BCB5: QXIMInputContext::setMicroFocus(int, int, 
int, int, QFont*) (qximinputcontext_x11.cpp:758)
==30009==    by 0x87C89F3: QWidget::setMicroFocusHint(int, int, int, 
int, bool, QFont*) (qwidget_x11.cpp:981)
==30009==    by 0xF5C7C82: TEWidget::setCursorPos(int, int) 
(TEWidget.cpp:793)
==30009==    by 0xF5D8F79: TEmulation::showBulk() (TEmulation.cpp:471)
==30009==    by 0xF5D9027: TEmulation::setConnect(bool) 
(TEmulation.cpp:494)
==30009==    by 0xF5CF923: TEmuVt102::setConnect(bool) 
(TEmuVt102.cpp:1195)
==30009==    by 0xF5BB692: TESession::setConnect(bool) (session.cpp:352)
==30009==    by 0xF5B18DD: konsolePart::newSession() 
(konsole_part.cpp:1088)
==30009==    by 0xF5B193C: konsolePart::startProgram(QString const&, 
QStrList const&) (konsole_part.cpp:1054)
==30009==    by 0xF5AE81E: konsolePart::showShellInDir(QString const&) 
(konsole_part.cpp:1102)
==30009==    by 0xF5ADD22: konsolePart::showShell() 
(konsole_part.cpp:1117)
==30009==    by 0xF5ADD4F: konsolePart::autoShowShell() 
(konsole_part.cpp:212)
==30009==    by 0xF5B498B: konsolePart::qt_invoke(int, QUObject*) 
(konsole_part.moc:334)
==30009==    by 0x884B7AB: QObject::activate_signal(QConnectionList*, 
QUObject*) (qobject.cpp:2356)
==30009==    by 0x8B2D307: QSignal::signal(QVariant const&) 
(moc_qsignal.cpp:100)
==30009==    by 0x88642B4: QSignal::activate() (qsignal.cpp:212)
==30009==    by 0x886A8D7: QSingleShotTimer::event(QEvent*) 
(qtimer.cpp:286)
==30009==    by 0x87F4984: QApplication::internalNotify(QObject*, 
QEvent*) (qapplication.cpp:2636)
==30009==    by 0x87F55B6: QApplication::notify(QObject*, QEvent*) 
(qapplication.cpp:2359)
==30009==  Address 0x15403708 is not stack'd, malloc'd or (recently) 
free'd
==30009==
==30009== Invalid read of size 1
==30009==    at 0x88796A8: QWidget::topLevelWidget() const 
(qwidget.cpp:2359)
==30009==    by 0xE58BCB5: QXIMInputContext::setMicroFocus(int, int, 
int, int, QFont*) (qximinputcontext_x11.cpp:758)
==30009==    by 0x87C89F3: QWidget::setMicroFocusHint(int, int, int, 
int, bool, QFont*) (qwidget_x11.cpp:981)
==30009==    by 0xF5C7C82: TEWidget::setCursorPos(int, int) 
(TEWidget.cpp:793)
==30009==    by 0xF5D8F79: TEmulation::showBulk() (TEmulation.cpp:471)
==30009==    by 0xF5D9027: TEmulation::setConnect(bool) 
(TEmulation.cpp:494)
==30009==    by 0xF5CF923: TEmuVt102::setConnect(bool) 
(TEmuVt102.cpp:1195)
==30009==    by 0xF5BB692: TESession::setConnect(bool) (session.cpp:352)
==30009==    by 0xF5B18DD: konsolePart::newSession() 
(konsole_part.cpp:1088)
==30009==    by 0xF5B193C: konsolePart::startProgram(QString const&, 
QStrList const&) (konsole_part.cpp:1054)
==30009==    by 0xF5AE81E: konsolePart::showShellInDir(QString const&) 
(konsole_part.cpp:1102)
==30009==    by 0xF5ADD22: konsolePart::showShell() 
(konsole_part.cpp:1117)
==30009==    by 0xF5ADD4F: konsolePart::autoShowShell() 
(konsole_part.cpp:212)
==30009==    by 0xF5B498B: konsolePart::qt_invoke(int, QUObject*) 
(konsole_part.moc:334)
==30009==    by 0x884B7AB: QObject::activate_signal(QConnectionList*, 
QUObject*) (qobject.cpp:2356)
==30009==    by 0x8B2D307: QSignal::signal(QVariant const&) 
(moc_qsignal.cpp:100)
==30009==    by 0x88642B4: QSignal::activate() (qsignal.cpp:212)
==30009==    by 0x886A8D7: QSingleShotTimer::event(QEvent*) 
(qtimer.cpp:286)
==30009==    by 0x87F4984: QApplication::internalNotify(QObject*, 
QEvent*) (qapplication.cpp:2636)
==30009==    by 0x87F55B6: QApplication::notify(QObject*, QEvent*) 
(qapplication.cpp:2359)
==30009==  Address 0x73006E006F00E7 is not stack'd, malloc'd or 
(recently) free'd
KCrash: crashing... crashRecursionCounter = 2
KCrash: Application Name = kdevelop path = <unknown> pid = 30009


Which gives a hint that the topLevelWidget might be corrupted. I copied 
the code from QXIMInputContext::setMicroFocus into the konsole part 
just before the setMicroFocusHint is called and it does not crash 
there. The problem might be that the QXIMInputContext itself is 
corrupted! In QWidget::setMicroFocusHint the inputcontext is created, 
or retrieved from icWidget->topData()->xic. Might be a problem 
somewhere here and in some cases this returns an invalid pointer.
It is true that I do not see any assignment to QWidget::topData()->xic 
[=QWidget::extra->topExtra->xic] but one place to set it to 0 and 
commented as "created lazily", altough it is used in many places.

Maybe someone can look at it and see if I'm right here, or the problem 
is in another place.
Until that I still recommend the hasFocus() workaround.

Andras

-- 
Quanta Plus developer - http://quanta.kdewebdev.org
K Desktop Environment - http://www.kde.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20060908/92409067/attachment.sig>


More information about the kde-core-devel mailing list