summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Begumisa <ben_g@users.sourceforge.net>2008-08-21 20:05:24 +0000
committerGerald Begumisa <ben_g@users.sourceforge.net>2008-08-21 20:05:24 +0000
commit758c81485d816de9fbf76889979e6bd853f118dd (patch)
treeed8fe0011a66d22f9e277992cd7f7f92310e2725
parent4d379dedb4894c89d8ce13ccd313e027cb5459a8 (diff)
Adjusted the CCM5 packet parser to assume that Ccm5CallInfo packets have parties section of variable length.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@556 09dcff7a-b715-0410-9601-b79a96267cd0
-rw-r--r--orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.cpp9
-rw-r--r--orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h2
-rw-r--r--orkaudio/audiocaptureplugins/voip/VoIp.cpp11
3 files changed, 15 insertions, 7 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.cpp b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.cpp
index 660fd08..1e25a2a 100644
--- a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.cpp
+++ b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.cpp
@@ -154,6 +154,7 @@ bool SkinnyValidateCallInfo(SkCallInfoStruct* sci, u_char* packetEnd)
bool SkinnyValidateCcm5CallInfo(SkCcm5CallInfoStruct *sci, u_char* packetEnd)
{
+ int partiesLen = 0;
bool valid = true;
if(((u_char*)sci + sizeof(SkCcm5CallInfoStruct)) > packetEnd)
{
@@ -163,19 +164,23 @@ bool SkinnyValidateCcm5CallInfo(SkCcm5CallInfoStruct *sci, u_char* packetEnd)
{
valid = false;
}
+ partiesLen = (int)packetEnd - (int)sci - sizeof(SkCcm5CallInfoStruct);
if(valid)
{
- valid = checkPartyString(sci->parties, SKINNY_CCM5_PARTIES_BLOCK_SIZE);
+ valid = checkPartyString(sci->parties, partiesLen);
}
if(valid)
{
// Find the first null char separating the calling and called parties (at this point, we know there's one)
char* nullChar = (char*)&sci->parties;
+ int skip = 0;
while(*nullChar != '\0')
{
nullChar++;
+ skip++;
}
- valid = checkPartyString(nullChar+1, SKINNY_CCM5_PARTIES_BLOCK_SIZE);
+ skip += 1;
+ valid = checkPartyString(nullChar+1, (partiesLen - skip));
}
return valid;
}
diff --git a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
index 105940d..ce33534 100644
--- a/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
+++ b/orkaudio/audiocaptureplugins/voip/PacketHeaderDefs.h
@@ -166,7 +166,7 @@ typedef struct
unsigned long callId;
unsigned long callType;
char unknown2[20];
- char parties[SKINNY_CCM5_PARTIES_BLOCK_SIZE];
+ char parties[0];
} SkCcm5CallInfoStruct;
bool SkinnyValidateCcm5CallInfo(SkCcm5CallInfoStruct *, u_char* packetEnd);
diff --git a/orkaudio/audiocaptureplugins/voip/VoIp.cpp b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
index 418b685..1f8620b 100644
--- a/orkaudio/audiocaptureplugins/voip/VoIp.cpp
+++ b/orkaudio/audiocaptureplugins/voip/VoIp.cpp
@@ -1917,10 +1917,13 @@ void HandleSkinnyMessage(SkinnyHeaderStruct* skinnyHeader, IpHeaderStruct* ipHea
{
// Extract Calling and Called number.
CStdString callingParty;
+ int partiesLen = 0;
char* parties = (char*)(&ccm5CallInfo->parties);
- GrabToken(parties, parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE, callingParty);
+
+ partiesLen = (int)packetEnd - (int)ccm5CallInfo - sizeof(SkCcm5CallInfoStruct);
+ GrabToken(parties, parties+partiesLen, callingParty);
CStdString calledParty;
- GrabToken(parties+callingParty.size()+1, parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE, calledParty);
+ GrabToken(parties+callingParty.size()+1, parties+partiesLen, calledParty);
CStdString callingPartyName;
if(DLLCONFIG.m_skinnyNameAsLocalParty)
@@ -1930,10 +1933,10 @@ void HandleSkinnyMessage(SkinnyHeaderStruct* skinnyHeader, IpHeaderStruct* ipHea
char *partiesPtr = NULL;
partiesPtr = parties;
- while(tokenNr < 9 && partiesPtr < parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE)
+ while(tokenNr < 9 && partiesPtr < parties+partiesLen)
{
callingPartyName = "";
- GrabTokenAcceptSpace(partiesPtr, parties+SKINNY_CCM5_PARTIES_BLOCK_SIZE, callingPartyName);
+ GrabTokenAcceptSpace(partiesPtr, parties+partiesLen, callingPartyName);
partiesPtr += callingPartyName.size() + 1;
tokenNr += 1;
}