Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invalid read from MidiJack with Audio Interface "Dummy" #5823

Closed
JohannesLorenz opened this issue Dec 4, 2020 · 3 comments · Fixed by #5907
Closed

Invalid read from MidiJack with Audio Interface "Dummy" #5823

JohannesLorenz opened this issue Dec 4, 2020 · 3 comments · Fixed by #5907

Comments

@JohannesLorenz
Copy link
Contributor

Bug Summary

With Audio Interface "Dummy" + Midi Interface "Jack", you can get an invalid read when closing LMMS (see below). With both being Jack, it's OK.

Steps to reproduce

Go to the settings. Choose Audio Interface "Dummy" + Midi Interface "Jack. Restart LMMS. Close LMMS.

Expected behavior

No Crash.

Actual behavior

Crash.

Affected LMMS versions

All

Logs

Click to expand
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
std::__atomic_base::store (__m=std::memory_order_seq_cst, __p=0x0, this=0xa0) at /usr/include/c++/10.2.0/bits/atomic_base.h:725
725             __atomic_store_n(&_M_p, __p, int(__m));
(gdb) bt
#0  std::__atomic_base::store(MidiJack*, std::memory_order) (__m=std::memory_order_seq_cst, __p=0x0, this=0xa0) at /usr/include/c++/10.2.0/bits/atomic_base.h:725
#1  std::__atomic_base::operator=(MidiJack*) (this=0xa0, __p=0x0) at /usr/include/c++/10.2.0/bits/atomic_base.h:632
#2  0x00000000003d67e7 in std::atomic::operator=(MidiJack*) (this=0xa0, __p=0x0) at /usr/include/c++/10.2.0/atomic:385
#3  0x000000000040bf99 in AudioJack::removeMidiClient() (this=0x0) at /home/johannes/cprogs/lmms/lv2/include/AudioJack.h:61
#4  0x000000000040b8f0 in MidiJack::~MidiJack() (this=0x18a8af30, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/midi/MidiJack.cpp:122
#5  0x000000000040ba04 in MidiJack::~MidiJack() (this=0x18a8af30, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/midi/MidiJack.cpp:152
#6  0x000000000037483d in Mixer::~Mixer() (this=0xaffdec0, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/Mixer.cpp:189
#7  0x00000000003749f6 in Mixer::~Mixer() (this=0xaffdec0, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/Mixer.cpp:201
#8  0x000000000034b643 in LmmsCore::deleteHelper(Mixer**) (ptr=0x6fefb0 ) at /home/johannes/cprogs/lmms/lv2/include/Engine.h:137
#9  0x000000000034b01a in LmmsCore::destroy() () at /home/johannes/cprogs/lmms/lv2/src/core/Engine.cpp:101
#10 0x00000000004411d1 in MainWindow::~MainWindow() (this=0x1947f790, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/gui/MainWindow.cpp:276
#11 0x0000000000441246 in MainWindow::~MainWindow() (this=0x1947f790, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/gui/MainWindow.cpp:277
#12 0x00000000061245a0 in QObject::event(QEvent*) () at /usr/lib/libQt5Core.so.5
#13 0x0000000004a07752 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#14 0x00000000060f7cda in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5
#15 0x00000000060fa7d3 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#16 0x0000000006151304 in  () at /usr/lib/libQt5Core.so.5
#17 0x0000000007208914 in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0
#18 0x000000000725c7d1 in  () at /usr/lib/libglib-2.0.so.0
#19 0x0000000007207121 in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#20 0x0000000006150941 in QEventDispatcherGlib::processEvents(QFlags) () at /usr/lib/libQt5Core.so.5
#21 0x00000000060f665c in QEventLoop::exec(QFlags) () at /usr/lib/libQt5Core.so.5
#22 0x00000000060feaf4 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5
#23 0x00000000002e6219 in main(int, char**) (argc=1, argv=0x1ffefffbf8) at /home/johannes/cprogs/lmms/lv2/src/core/main.cpp:988
(gdb) c
Continuing.

Thread 1 received signal SIGSEGV, Segmentation fault.
std::__atomic_base<MidiJack*>::store (__m=std::memory_order_seq_cst, __p=0x0, this=0xa0) at /usr/include/c++/10.2.0/bits/atomic_base.h:725
725 __atomic_store_n(&_M_p, __p, int(__m));
(gdb) bt
#0 std::__atomic_base<MidiJack*>::store(MidiJack*, std::memory_order) (__m=std::memory_order_seq_cst, __p=0x0, this=0xa0) at /usr/include/c++/10.2.0/bits/atomic_base.h:725
#1 std::__atomic_base<MidiJack*>::operator=(MidiJack*) (this=0xa0, __p=0x0) at /usr/include/c++/10.2.0/bits/atomic_base.h:632
#2 0x00000000003d67e7 in std::atomic<MidiJack*>::operator=(MidiJack*) (this=0xa0, __p=0x0) at /usr/include/c++/10.2.0/atomic:385
#3 0x000000000040bf99 in AudioJack::removeMidiClient() (this=0x0) at /home/johannes/cprogs/lmms/lv2/include/AudioJack.h:61
#4 0x000000000040b8f0 in MidiJack::~MidiJack() (this=0x18a8af30, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/midi/MidiJack.cpp:122
#5 0x000000000040ba04 in MidiJack::~MidiJack() (this=0x18a8af30, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/midi/MidiJack.cpp:152
#6 0x000000000037483d in Mixer::~Mixer() (this=0xaffdec0, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/Mixer.cpp:189
#7 0x00000000003749f6 in Mixer::~Mixer() (this=0xaffdec0, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/core/Mixer.cpp:201
#8 0x000000000034b643 in LmmsCore::deleteHelper(Mixer**) (ptr=0x6fefb0 LmmsCore::s_mixer) at /home/johannes/cprogs/lmms/lv2/include/Engine.h:137
#9 0x000000000034b01a in LmmsCore::destroy() () at /home/johannes/cprogs/lmms/lv2/src/core/Engine.cpp:101
#10 0x00000000004411d1 in MainWindow::~MainWindow() (this=0x1947f790, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/gui/MainWindow.cpp:276
#11 0x0000000000441246 in MainWindow::~MainWindow() (this=0x1947f790, __in_chrg=) at /home/johannes/cprogs/lmms/lv2/src/gui/MainWindow.cpp:277
#12 0x00000000061245a0 in QObject::event(QEvent*) () at /usr/lib/libQt5Core.so.5
#13 0x0000000004a07752 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#14 0x00000000060f7cda in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5
#15 0x00000000060fa7d3 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#16 0x0000000006151304 in () at /usr/lib/libQt5Core.so.5
#17 0x0000000007208914 in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0
#18 0x000000000725c7d1 in () at /usr/lib/libglib-2.0.so.0
#19 0x0000000007207121 in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#20 0x0000000006150941 in QEventDispatcherGlib::processEvents(QFlagsQEventLoop::ProcessEventsFlag) () at /usr/lib/libQt5Core.so.5
#21 0x00000000060f665c in QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) () at /usr/lib/libQt5Core.so.5
#22 0x00000000060feaf4 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5
#23 0x00000000002e6219 in main(int, char**) (argc=1, argv=0x1ffefffbf8) at /home/johannes/cprogs/lmms/lv2/src/core/main.cpp:988

@PhysSong
Copy link
Member

PhysSong commented Dec 5, 2020

It looks like a regression in #5452. You should have added a check for m_jackAudio before calling removeMidiClient().

if(jackClient())
{
// remove ourselves first (atomically), so we will not get called again
m_jackAudio->removeMidiClient();

@JohannesLorenz
Copy link
Contributor Author

I'll mark this as a good first issue. @PhysSong 's analysis explains how to solve it, and it's alsmost a one-liner.

@salilra
Copy link
Contributor

salilra commented Feb 13, 2021

#5907

I've started this PR. Can someone review?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants