From 3d942915a3aaf28d3c38cc7f94e1cc730f5f60d9 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 5 Apr 2006 10:33:41 +0000 Subject: [PATCH] fix setCommandString --- lib/dvb/frontend.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index cb853e2b..eba474e8 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -57,10 +57,40 @@ void eDVBDiseqcCommand::setCommandString(const char *str) { if (!str) return; - len = strlen(str); - if (len > MAX_DISEQC_LENGTH) - len = MAX_DISEQC_LENGTH; - memcpy(data, str, len); + len=0; + int slen = strlen(str); + if (slen % 2) + { + eDebug("invalid diseqc command string length (not 2 byte aligned)"); + return; + } + if (slen > MAX_DISEQC_LENGTH*2) + { + eDebug("invalid diseqc command string length (string is to long)"); + return; + } + unsigned char val=0; + for (int i=0; i < slen; ++i) + { + unsigned char c = str[i]; + switch(c) + { + case '0' ... '9': c-=48; break; + case 'a' ... 'f': c-=87; break; + case 'A' ... 'F': c-=55; break; + default: + eDebug("invalid character in hex string..ignore complete diseqc command !"); + return; + } + if ( i % 2 ) + { + val |= c; + data[i/2] = val; + } + else + val = c << 4; + } + len = slen/2; } void eDVBFrontendParametersSatellite::set(const SatelliteDeliverySystemDescriptor &descriptor) -- 2.30.2