Hi, I got the following backtrace. It is not really possible to
manually reproduce (the recipe has 1779 keypresses, see [1]); however,
this looks like a simple Null dereference. At a glance it seems that
the attached patch should fix the problem, and I can no longer
reproduce a crash with the patch applied. Does the patch look OK?

[1] http://gmatht.homelinux.net/xp/keytest/html_out/out/t15/misc/

Also should I go through all the backtraces generated by keytest and
harden the areas of code where a Null dereference has occured (even if
I do not know how to reproduce)? If so should I be adding some thing
line
   ASSERT(buf) // There shouldn't be a null here but keytest claims there can be
?

Program received signal SIGSEGV, Segmentation fault.
lyx::Buffer::absFileName (this=0x0) at Buffer.cpp:2513
2513            return d->filename.absFileName();
(gdb) #0  lyx::Buffer::absFileName (this=0x0) at Buffer.cpp:2513
#1  0x0000000000d43dd9 in
lyx::frontend::FindAndReplaceWidget::findAndReplaceScope
(this=0x21c4c70, opt=<value optimised out>,
    replace_all=<value optimised out>) at FindAndReplace.cpp:358
#2  0x0000000000d4557c in lyx::frontend::FindAndReplaceWidget::findAndReplace (
    this=0x21c4c70, casesensitive=<value optimised out>,
    matchword=<value optimised out>, backwards=<value optimised out>,
    expandmacros=<value optimised out>, ignoreformat=<value optimised out>,
    replace=true, keep_case=false, replace_all=48) at FindAndReplace.cpp:428
#3  0x0000000000d45a21 in lyx::frontend::FindAndReplaceWidget::findAndReplace (
    this=0x21c4c70, backwards=6, replace=true, replace_all=false)
    at FindAndReplace.cpp:454
#4  0x0000000000d45bff in
lyx::frontend::FindAndReplaceWidget::on_replacePB_clicked
(this=0x21c4c70) at FindAndReplace.cpp:473
#5  0x0000000000d45cbc in lyx::frontend::FindAndReplaceWidget::qt_metacall (
    this=0x21c4c70, _c=QMetaObject::InvokeMetaMethod,
    _id=<value optimised out>, _a=<value optimised out>)
    at moc_FindAndReplace.cpp:79
#6  0x00007ffff607ae3f in QMetaObject::activate (sender=0x21e8e00,
    m=<value optimised out>, local_signal_index=<value optimised out>,
    argv=0x6) at kernel/qobject.cpp:3293
#7  0x00007ffff6bd65f2 in QAbstractButton::clicked (this=0x7fffffff9610,
    _t1=false) at .moc/release-shared/moc_qabstractbutton.cpp:206
#8  0x00007ffff68f086b in QAbstractButtonPrivate::emitClicked (this=0x21f5fd0)
    at widgets/qabstractbutton.cpp:546
#9  0x00007ffff68f170b in QAbstractButtonPrivate::click (this=0x21f5fd0)
    at widgets/qabstractbutton.cpp:539
#10 0x00007ffff68f17ec in QAbstractButton::timerEvent (this=0x21e8e00,
    e=<value optimised out>) at widgets/qabstractbutton.cpp:1258
#11 0x00007ffff6077a63 in QObject::event (this=0x21e8e00, e=0x7fffffffa4a0)
    at kernel/qobject.cpp:1212
#12 0x00007ffff6590bdf in QWidget::event (this=0x21e8e00, event=0x7fffffffa4a0)
    at kernel/qwidget.cpp:8455
#13 0x00007ffff653b22c in QApplicationPrivate::notify_helper (this=0x15527b0,
    receiver=0x21e8e00, e=0x7fffffffa4a0) at kernel/qapplication.cpp:4300
#14 0x00007ffff65416fb in QApplication::notify (this=0x154ffe0,
    receiver=0x21e8e00, e=0x7fffffffa4a0) at kernel/qapplication.cpp:4183
#15 0x0000000000c89bbd in lyx::frontend::GuiApplication::notify (
    this=0x7fffffff9610, receiver=0x0, event=0x48aca30)
    at GuiApplication.cpp:2155
#16 0x00007ffff606806c in QCoreApplication::notifyInternal (this=0x154ffe0,
    receiver=0x21e8e00, event=0x7fffffffa4a0)
    at kernel/qcoreapplication.cpp:704
#17 0x00007ffff6094d42 in QCoreApplication::sendEvent (this=0x1562a50)
    at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:215
#18 QTimerInfoList::activateTimers (this=0x1562a50)
    at kernel/qeventdispatcher_unix.cpp:603
#19 0x00007ffff6091848 in timerSourceDispatch (source=<value optimised out>)
    at kernel/qeventdispatcher_glib.cpp:184
#20 idleTimerSourceDispatch (source=<value optimised out>)
    at kernel/qeventdispatcher_glib.cpp:231


-- 
John C. McCabe-Dansted
Index: src/frontends/qt4/FindAndReplace.cpp
===================================================================
--- src/frontends/qt4/FindAndReplace.cpp	(revision 37938)
+++ src/frontends/qt4/FindAndReplace.cpp	(working copy)
@@ -353,7 +353,7 @@
 			if (wrap_answer == 1)
 				break;
 		}
-		if (buf != &view_.documentBufferView()->buffer())
+		if (buf && buf != &view_.documentBufferView()->buffer())
 			lyx::dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
 						  buf->absFileName()));
 		bv = view_.documentBufferView();

Reply via email to