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

            Bug ID: 356647
           Summary: use-after-free crash on closing cervisia having opened
                    a non-CVS folder
           Product: cervisia
           Version: unspecified
          Platform: Compiled Sources
                OS: Linux
            Status: UNCONFIRMED
          Severity: crash
          Priority: NOR
         Component: general
          Assignee: christian.lo...@hamburg.de
          Reporter: santhiar.anir...@gmail.com

Cervisia crashes with a use-after-free bug on closing the application after
opening an non-CVS folder.
I ran into this problem on driving Cervisia via a command line script.
I opened a non CVS folder via the command line, and while the error dialog was
being displayed, 
closed Cervisia using qdbus
The application crashed

Reproducible: Always

Steps to Reproduce:
1. From a terminal, say "cervisia nonCVSFolder"
2. When the error dialog is displayed, from another terminal, issue
3. "qdbus `qdbus | grep cervisia` /cervisia/MainWindow_1/actions/file_quit
trigger"

Actual Results:  
Cervisia crashes

Expected Results:  
Cervisia closes smoothly

Application details:
Qt: 4.8.7
KDE Development Platform: 4.14.13
Cervisia: 3.10.0

KCrash Report:
Application: Cervisia (cervisia), signal: Segmentation fault
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[KCrash Handler]
#6  0x00007fcea1956a81 in QMap<QAction*, KUrl>::constBegin (this=<optimized
out>) at qt4/include/QtCore/qmap.h:374
#7  0x00007fcea19542c0 in KRecentFilesAction::removeUrl (this=<optimized out>,
url=...) at KDE/kde/kdelibs/kdeui/actions/krecentfilesaction.cpp:234
#8  0x00007fce949c5074 in CervisiaPart::openSandbox (this=0xa97c40, url=...) at
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:1813
#9  0x00007fce949c49a9 in CervisiaPart::openUrl (this=0xa97c40, u=...) at
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:222
#10 0x00007fcea43a4d8b in CervisiaShell::openURL (this=<optimized out>,
url=...) at KDE/kde/kdesdk/cervisia/cervisiashell.cpp:139
#11 0x00007fcea43a15fe in kdemain (argc=<optimized out>, argv=<optimized out>)
at KDE/kde/kdesdk/cervisia/main.cpp:196
#12 0x0000000000400a21 in main (argc=-1641208064, argv=0xffffffff) at
KDE/build/kde/kdesdk/cervisia/cervisia_dummy.cpp:3

On investigating further using Cervisia built with Address Sanitizer, this is a
use-after-free vulnerability. AddressSanitizer reported the following stack:

=================================================================
==12997==ERROR: AddressSanitizer: heap-use-after-free on address 0x61100013e3f0
at pc 0x7fdd437ea9cd bp 0x7fffc88647b0 sp 0x7fffc88647a8
READ of size 8 at 0x61100013e3f0 thread T0
    #0 0x7fdd437ea9cc in CervisiaPart::openSandbox(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:1813
    #1 0x7fdd437e80a9 in CervisiaPart::openUrl(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:222
    #2 0x7fdd571558b4 in CervisiaShell::openURL(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:139
    #3 0x7fdd5714cce1 in kdemain KDE/kde/kdesdk/cervisia/main.cpp:196
    #4 0x445ce8 in main (KDE/install-asan/bin/cervisia+0x445ce8)
    #5 0x7fdd50e5376c (/lib/x86_64-linux-gnu/libc.so.6+0x2176c)
    #6 0x445bec in _start (KDE/install-asan/bin/cervisia+0x445bec)
0x61100013e3f0 is located 112 bytes inside of 216-byte region
[0x61100013e380,0x61100013e458)
freed by thread T0 here:
    #0 0x43120a in operator delete(void*)
(KDE/install-asan/bin/cervisia+0x43120a)
    #1 0x7fdd437e6419 in CervisiaPart::~CervisiaPart()
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:180
    #2 0x7fdd5715528f in CervisiaShell::~CervisiaShell()
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:81
    #3 0x7fdd57154ca5 in ~CervisiaShell
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:80
    #4 0x7fdd57154ca5 in CervisiaShell::~CervisiaShell()
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:80
    #5 0x7fdd53509e3d in qDeleteInEventHandler(QObject*)
(qt4/lib/libQtCore.so.4+0x24ee3d)
    #6 0x7fdd535099a7 in QObject::event(QEvent*)
(qt4/lib/libQtCore.so.4+0x24e9a7)
    #7 0x7fdd522ef345 in QWidget::event(QEvent*)
(qt4/lib/libQtGui.so.4+0x2c0345)
    #8 0x7fdd52910f72 in QMainWindow::event(QEvent*)
(qt4/lib/libQtGui.so.4+0x8e1f72)
    #9 0x7fdd553a4133 in KMainWindow::event(QEvent*)
KDE/kde/kdelibs/kdeui/widgets/kmainwindow.cpp:1126
    #10 0x7fdd554aa0b2 in KXmlGuiWindow::event(QEvent*)
KDE/kde/kdelibs/kdeui/xmlgui/kxmlguiwindow.cpp:126
    #11 0x7fdd5226448e in QApplicationPrivate::notify_helper(QObject*, QEvent*)
(qt4/lib/libQtGui.so.4+0x23548e)
    #12 0x7fdd5226a32b in QApplication::notify(QObject*, QEvent*)
(qt4/lib/libQtGui.so.4+0x23b32b)
    #13 0x7fdd55084340 in KApplication::notify(QObject*, QEvent*)
KDE/kde/kdelibs/kdeui/kernel/kapplication.cpp:311
    #14 0x7fdd534e8dc5 in QCoreApplication::notifyInternal(QObject*, QEvent*)
(qt4/lib/libQtCore.so.4+0x22ddc5)
    #15 0x7fdd534ed549 in QCoreApplication::sendEvent(QObject*, QEvent*)
(qt4/lib/libQtCore.so.4+0x232549)
    #16 0x7fdd534ea3f3 in QCoreApplicationPrivate::sendPostedEvents(QObject*,
int, QThreadData*) (qt4/lib/libQtCore.so.4+0x22f3f3)
    #17 0x7fdd5353b2f6 in
QEventDispatcherUNIX::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(qt4/lib/libQtCore.so.4+0x2802f6)
    #18 0x7fdd5237c669 in
QEventDispatcherX11::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(qt4/lib/libQtGui.so.4+0x34d669)
    #19 0x7fdd534e3f6b in
QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
(qt4/lib/libQtCore.so.4+0x228f6b)
    #20 0x7fdd534e4331 in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
(qt4/lib/libQtCore.so.4+0x229331)
    #21 0x7fdd52a18c8a in QDialog::exec() (qt4/lib/libQtGui.so.4+0x9e9c8a)
    #22 0x7fdd54e109dc in KMessageBox::createKMessageBox(KDialog*, QIcon
const&, QString const&, QStringList const&, QString const&, bool*,
QFlags<KMessageBox::Option>, QString const&, QMessageBox::Icon)
KDE/kde/kdelibs/kdeui/dialogs/kmessagebox.cpp:344
    #23 0x7fdd54e0dfe1 in KMessageBox::createKMessageBox(KDialog*,
QMessageBox::Icon, QString const&, QStringList const&, QString const&, bool*,
QFlags<KMessageBox::Option>, QString const&)
KDE/kde/kdelibs/kdeui/dialogs/kmessagebox.cpp:158
    #24 0x7fdd54e20f44 in KMessageBox::sorryWId(unsigned long, QString const&,
QString const&, QFlags<KMessageBox::Option>)
KDE/kde/kdelibs/kdeui/dialogs/kmessagebox.cpp:928
    #25 0x7fdd54e2090d in KMessageBox::sorry(QWidget*, QString const&, QString
const&, QFlags<KMessageBox::Option>)
KDE/kde/kdelibs/kdeui/dialogs/kmessagebox.cpp:907
    #26 0x7fdd437e9814 in CervisiaPart::openSandbox(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:1807
    #27 0x7fdd437e80a9 in CervisiaPart::openUrl(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:222
    #28 0x7fdd571558b4 in CervisiaShell::openURL(KUrl const&)
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:139
    #29 0x7fdd5714cce1 in kdemain KDE/kde/kdesdk/cervisia/main.cpp:196
    #30 0x445ce8 in main (KDE/install-asan/bin/cervisia+0x445ce8)
    #31 0x7fdd50e5376c (/lib/x86_64-linux-gnu/libc.so.6+0x2176c)
    #32 0x445bec in _start (KDE/install-asan/bin/cervisia+0x445bec)
previously allocated by thread T0 here:
    #0 0x430f8a in operator new(unsigned long)
(KDE/install-asan/bin/cervisia+0x430f8a)
    #1 0x7fdd437f58c9 in QObject*
KPluginFactory::createPartInstance<CervisiaPart>(QWidget*, QObject*,
QList<QVariant> const&) KDE/install-asan/include/kpluginfactory.h:483
    #2 0x7fdd543410cc in KPluginFactory::create(char const*, QWidget*,
QObject*, QList<QVariant> const&, QString const&)
KDE/kde/kdelibs/kdecore/util/kpluginfactory.cpp:203
    #3 0x7fdd5715781e in KParts::ReadOnlyPart*
KPluginFactory::create<KParts::ReadOnlyPart>(QObject*, QList<QVariant> const&)
KDE/install-asan/include/kpluginfactory.h:507
    #4 0x7fdd57151019 in CervisiaShell::CervisiaShell(char const*)
KDE/kde/kdesdk/cervisia/cervisiashell.cpp:48
    #5 0x7fdd5714cbfa in kdemain KDE/kde/kdesdk/cervisia/main.cpp:190
    #6 0x445ce8 in main (KDE/install-asan/bin/cervisia+0x445ce8)
    #7 0x7fdd50e5376c (/lib/x86_64-linux-gnu/libc.so.6+0x2176c)
    #8 0x445bec in _start (KDE/install-asan/bin/cervisia+0x445bec)
SUMMARY: AddressSanitizer: heap-use-after-free
KDE/kde/kdesdk/cervisia/cervisiapart.cpp:1813 CervisiaPart::openSandbox(KUrl
const&)
Shadow bytes around the buggy address:
  0x0c228001fc20: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c228001fc30: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c228001fc40: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x0c228001fc50: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c228001fc60: fd fd fd fd fd fd fa fa fa fa fa fa fa fa fa fa
=>0x0c228001fc70: fd fd fd fd fd fd fd fd fd fd fd fd fd fd[fd]fd
  0x0c228001fc80: fd fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa
  0x0c228001fc90: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x0c228001fca0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x0c228001fcb0: fd fd fd fd fd fd fd fd fa fa fa fa fa fa fa fa
  0x0c228001fcc0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:     fa
  Heap right redzone:    fb
  Freed heap region:     fd
  Stack left redzone:    f1
  Stack mid redzone:     f2
  Stack right redzone:   f3
  Stack partial redzone: f4
  Stack after return:    f5
  Stack use after scope: f8
  Global redzone:        f9
  Global init order:     f6
  Poisoned by user:      f7
  ASan internal:         fe
==12997==ABORTING

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

Reply via email to