From: ghost Date: Fri, 12 Jun 2009 17:13:52 +0000 (+0200) Subject: dvbci.cpp: fix segfault on channel change X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=1ea12ba62fbecbf81fff13411f26ad1cb59edd5c dvbci.cpp: fix segfault on channel change --- diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index 0a32b8f..037103c 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -552,6 +552,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) if (it != m_pmt_handlers.end()) { eDVBCISlot *slot = it->cislot; + eDVBCISlot *base_slot = slot; eDVBServicePMTHandler *pmthandler = it->pmthandler; m_pmt_handlers.erase(it); @@ -575,20 +576,17 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) while(slot) { + eDVBCISlot *next = slot->linked_next; if (!sameServiceExist) { -// if (slot->getNumOfServices() > 1) - { - eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt", - service_to_remove.toString().c_str()); - std::vector caids; - caids.push_back(0xFFFF); - slot->sendCAPMT(pmthandler, caids); // send a capmt without caids to remove a running service - } + eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt", + service_to_remove.toString().c_str()); + std::vector caids; + caids.push_back(0xFFFF); + slot->sendCAPMT(pmthandler, caids); // send a capmt without caids to remove a running service slot->removeService(service_to_remove.getServiceID().get()); } - eDVBCISlot *next = slot->linked_next; if (!--slot->use_count) { if (slot->linked_next) @@ -596,9 +594,7 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler) else setInputSource(slot->current_tuner, slot->current_source); - if (it->cislot == slot) // remove the base slot - it->cislot = slot->linked_next; - else + if (base_slot != slot) { eDVBCISlot *tmp = it->cislot; while(tmp->linked_next != slot)