[mythtv] Crash in ~DVBChannel()
roger at beardandsandals.co.uk
Mon May 15 16:29:30 UTC 2017
I recently put an old tt budget DVB-S card into my main system to do some
testing. This system already a quad tuner dvb-t card in it. Adding the new
card meant I immediately ran into persistent naming problems. I fixed this
in udev and edited the capture cards in myth to use the new names. Part of
this edit involved changing the driver type on one of the existing card
definitions from dvb-t to dvb-s, and of course changing the device names on
all the entries. This all looked great in mythtv-setup 5 capture cards 1
satellite and 4 terrestrial. However I had neglected to look at the second
page of the card details in the edit pages.
What I had actually ended up with in the database was.
2 entries pointing at my mono DVB-S card set up as parent and child, 2
entries pointing to tuner 1 on my quad card, 2 entries pointing at tuner 2,
1 pointing at tuner 3 and 1 pointing at tuner 4.
I fixed the crash by setting the concurrent recordings stuff back to 1.
But I think are more robust fix is needed.
The current code looks like this. It crashes because either the map does
not contain the key or it does but the list for that key is empty.
// set a new master if there are other instances and we're the master
// whether we are the master or not remove us from the map.
QString key = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, device);
key += QString(":%1") .arg(CardUtil::GetSourceID(m_pParent->GetInputId()));
DVBChannel *master = static_cast<DVBChannel*>(master_map[key].front());
I stuck some diagnostics in and I got this.
~DVBChannel(0x61500000cf80) key /dev/dvb/adapter_tt1/frontend0
~DVBChannel(0x61500000cf80) master_map does not contain key
~DVBChannel(0x61500000cf80) removing all instances of this from master_map
~DVBChannel(0x61500000cd00) key /dev/dvb/adapter_tt1/frontend0
~DVBChannel(0x61500000cd00) master_map for /dev/dvb/adapter_tt1/frontend0:0
~DVBChannel(0x61500000cd00) removing all instances of this from master_map
mythbackend.service: Main process exited, code=dumped, status=11/SEGV
Stopped MythTV backend service.
mythbackend.service: Unit entered failed state.
mythbackend.service: Failed with result 'core-dump'.
I had put the line that initially shows just the key a bit too early in the
function. The actual key is shown in the following lines.
More information about the mythtv-dev