aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/frontend.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-04 14:35:31 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-07-04 14:35:31 +0000
commit346cca7122e5a24664f595d9cc5bb042ebccc9bc (patch)
treecd3c2eebfdb5b7d45611eaa4cf1f8d71d9fcdae1 /lib/dvb/frontend.cpp
parent4b6f19109cd4bbab23af49e953537d1919348a0a (diff)
downloadenigma2-346cca7122e5a24664f595d9cc5bb042ebccc9bc.tar.gz
enigma2-346cca7122e5a24664f595d9cc5bb042ebccc9bc.zip
fix possible segfault
Diffstat (limited to 'lib/dvb/frontend.cpp')
-rw-r--r--lib/dvb/frontend.cpp83
1 files changed, 49 insertions, 34 deletions
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index 2992820e..cfd2610d 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -1350,8 +1350,9 @@ void eDVBFrontend::tuneLoop() // called by m_tuneTimer
break;
}
default:
+ eDebug("[SEC] unhandled sec command %d",
+ ++m_sec_sequence.current()->cmd);
++m_sec_sequence.current();
- eDebug("[SEC] unhandled sec command");
}
m_tuneTimer->start(delay,true);
}
@@ -1719,11 +1720,15 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
if (!m_sn)
{
eDebug("no frontend device opened... do not try to tune !!!");
- return -ENODEV;
+ res = -ENODEV;
+ goto tune_error;
}
if (m_type == -1)
- return -ENODEV;
+ {
+ res = -ENODEV;
+ goto tune_error;
+ }
m_sn->stop();
m_sec_sequence.clear();
@@ -1736,23 +1741,30 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
if (where.getDVBS(feparm))
{
eDebug("no dvbs data!");
- return -EINVAL;
+ res = -EINVAL;
+ goto tune_error;
}
- res=prepare_sat(feparm);
m_sec->setRotorMoving(false);
+ res=prepare_sat(feparm);
+ if (res)
+ goto tune_error;
+
break;
}
case feCable:
{
eDVBFrontendParametersCable feparm;
if (where.getDVBC(feparm))
- return -EINVAL;
- res=prepare_cable(feparm);
- if (!res)
{
- m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) );
- m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
+ res = -EINVAL;
+ goto tune_error;
}
+ res=prepare_cable(feparm);
+ if (res)
+ goto tune_error;
+
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) );
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
break;
}
case feTerrestrial:
@@ -1761,40 +1773,43 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where)
if (where.getDVBT(feparm))
{
eDebug("no -T data");
- return -EINVAL;
+ res = -EINVAL;
+ goto tune_error;
}
res=prepare_terrestrial(feparm);
- if (!res)
- {
- std::string enable_5V;
- char configStr[255];
- snprintf(configStr, 255, "config.Nim%c.terrestrial_5V", 'A'+m_fe);
- m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) );
- ePythonConfigQuery::getConfigValue(configStr, enable_5V);
- if (enable_5V == "on")
- m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
- else
- m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltageOff) );
- m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
- }
+ if (res)
+ goto tune_error;
+
+ std::string enable_5V;
+ char configStr[255];
+ snprintf(configStr, 255, "config.Nim%c.terrestrial_5V", 'A'+m_fe);
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT) );
+ ePythonConfigQuery::getConfigValue(configStr, enable_5V);
+ if (enable_5V == "on")
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ else
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltageOff) );
+ m_sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
+
break;
}
}
- if (!res) // prepare ok
- {
- m_tuneTimer->start(0,true);
- m_sec_sequence.current() = m_sec_sequence.begin();
+ m_tuneTimer->start(0,true);
+ m_sec_sequence.current() = m_sec_sequence.begin();
- if (m_state != stateTuning)
- {
- m_tuning = 1;
- m_state = stateTuning;
- m_stateChanged(this);
- }
+ if (m_state != stateTuning)
+ {
+ m_tuning = 1;
+ m_state = stateTuning;
+ m_stateChanged(this);
}
return res;
+
+tune_error:
+ m_tuneTimer->stop();
+ return res;
}
RESULT eDVBFrontend::connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)