Bug Description:
When searching for anything with 'Find all' checked, Binary Ninja usually crashes, but only on a certain database. I originally encountered this on macOS (on ARM), but reproduced it on x86_64 Linux in order to use valgrind.
Steps To Reproduce:
Please provide all steps required to reproduce the behavior:
Open my database. I can provide it privately if needed, but I'm kind of hoping that either it's easy to reproduce or the Valgrind logs are helpful.
Search for 'Invalid write'; there are some false positive errors, but 'Invalid write' is what happens when I search.
Example:
==65305== Invalid write of size 4
==65305== at 0x52B1956: QGraphicsEffectSource::pixmap(Qt::CoordinateSystem, QPoint*, QGraphicsEffect::PixmapPadMode) const (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x52B1A2E: QGraphicsEffect::sourcePixmap(Qt::CoordinateSystem, QPoint*, QGraphicsEffect::PixmapPadMode) const (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x52B2647: QGraphicsOpacityEffect::draw(QPainter*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5206907: QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207252: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207135: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5205B2C: QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207252: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5205B2C: QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207252: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207135: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x5207135: QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== Address 0x36fe62318 is 120 bytes inside a block of size 248 free'd
==65305== at 0x484699B: operator delete(void*, unsigned long) (vg_replace_malloc.c:935)
==65305== by 0xFF06379: QObject::~QObject() (in /home/comex/binja/binaryninja/libQt6Core.so.6)
==65305== by 0x52B0EEC: QGraphicsEffectSource::~QGraphicsEffectSource() (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x52B1F6B: QGraphicsEffect::~QGraphicsEffect() (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x52B20AC: QGraphicsOpacityEffect::~QGraphicsOpacityEffect() (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x51FA81B: QWidget::setGraphicsEffect(QGraphicsEffect*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x4BF1352: Pane::setIsActivePane(bool) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF18DB: SplitPaneContainer::enumeratePanes(std::function<void (Pane*)> const&) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF1914: SplitPaneContainer::enumeratePanes(std::function<void (Pane*)> const&) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF418D: SplitPaneContainer::updateStatus() (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x20E63C: ??? (in /home/comex/binja/binaryninja/binaryninja)
==65305== by 0x4B5A8BA: HexEditor::adjustSize(int, int) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== Block was alloc'd at
==65305== at 0x4843F2F: operator new(unsigned long) (vg_replace_malloc.c:422)
==65305== by 0x51FA839: QWidget::setGraphicsEffect(QGraphicsEffect*) (in /home/comex/binja/binaryninja/libQt6Widgets.so.6)
==65305== by 0x4BF1352: Pane::setIsActivePane(bool) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF18DB: SplitPaneContainer::enumeratePanes(std::function<void (Pane*)> const&) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF1914: SplitPaneContainer::enumeratePanes(std::function<void (Pane*)> const&) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BF418D: SplitPaneContainer::updateStatus() (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BFAA67: SplitPaneContainer::paneSplitRequested(Pane*, Qt::Edge) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x4BFB1F9: SplitPaneContainer::openForColumnCount(Pane*, Qt::Orientation, unsigned long) (in /home/comex/binja/binaryninja/libbinaryninjaui.so.1)
==65305== by 0x204150: ??? (in /home/comex/binja/binaryninja/binaryninja)
==65305== by 0x2125F1: ??? (in /home/comex/binja/binaryninja/binaryninja)
==65305== by 0x21390E: ??? (in /home/comex/binja/binaryninja/binaryninja)
==65305== by 0xFEFA216: QObject::event(QEvent*) (in /home/comex/binja/binaryninja/libQt6Core.so.6)
Version and Platform (required):
Bug Description: When searching for anything with 'Find all' checked, Binary Ninja usually crashes, but only on a certain database. I originally encountered this on macOS (on ARM), but reproduced it on x86_64 Linux in order to use valgrind.
Steps To Reproduce: Please provide all steps required to reproduce the behavior:
Valgrind logs: Run 1 Run 2 Run 3 Run 4
Search for 'Invalid write'; there are some false positive errors, but 'Invalid write' is what happens when I search.
Example: