1
0
Fork 0

Added sanity checks to MP receive/send.

Stop invalid data (NaN values) from being sent or received via MP.
This commit is contained in:
ThorstenB 2011-01-23 15:07:09 +01:00
parent 58550d9e70
commit feab53b462
2 changed files with 46 additions and 6 deletions

View file

@ -1,6 +1,6 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// //
// multiplaymgr.hpp // multiplaymgr.cxx
// //
// Written by Duncan McCreanor, started February 2003. // Written by Duncan McCreanor, started February 2003.
// duncan.mccreanor@airservicesaustralia.com // duncan.mccreanor@airservicesaustralia.com
@ -526,14 +526,44 @@ union FGMultiplayMgr::MsgBuf
T_MsgHdr Header; T_MsgHdr Header;
}; };
bool
FGMultiplayMgr::isSane(const FGExternalMotionData& motionInfo)
{
// check for corrupted data (NaNs)
bool isCorrupted = false;
isCorrupted |= ((osg::isNaN(motionInfo.time )) ||
(osg::isNaN(motionInfo.lag )) ||
(osg::isNaN(motionInfo.orientation(3) )));
for (unsigned i = 0; (i < 3)&&(!isCorrupted); ++i)
{
isCorrupted |= ((osg::isNaN(motionInfo.position(i) ))||
(osg::isNaN(motionInfo.orientation(i) ))||
(osg::isNaN(motionInfo.linearVel(i)) )||
(osg::isNaN(motionInfo.angularVel(i)) )||
(osg::isNaN(motionInfo.linearAccel(i)) )||
(osg::isNaN(motionInfo.angularAccel(i)) ));
}
return !isCorrupted;
}
void void
FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo) FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
{ {
if ((! mInitialised) || (! mHaveServer)) if ((! mInitialised) || (! mHaveServer))
return; return;
if (! mHaveServer) { if (! mHaveServer) {
SG_LOG( SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::SendMyPosition - no server"); SG_LOG( SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::SendMyPosition - no server");
return; return;
}
if (!isSane(motionInfo))
{
// Current local data is invalid (NaN), so stop MP transmission.
// => Be nice to older FG versions (no NaN checks) and don't waste bandwidth.
SG_LOG(SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::SendMyPosition - "
<< "Local data is invalid (NaN). Data not transmitted.");
return;
} }
static MsgBuf msgBuf; static MsgBuf msgBuf;
@ -780,7 +810,7 @@ FGMultiplayMgr::update(double)
} }
if (MsgHdr->Version != PROTO_VER) { if (MsgHdr->Version != PROTO_VER) {
SG_LOG( SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::MP_ProcessData - " SG_LOG( SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::MP_ProcessData - "
<< "message has invalid protocoll number!" ); << "message has invalid protocol number!" );
break; break;
} }
if (MsgHdr->MsgLen != bytes) { if (MsgHdr->MsgLen != bytes) {
@ -858,6 +888,15 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
for (unsigned i = 0; i < 3; ++i) for (unsigned i = 0; i < 3; ++i)
motionInfo.angularAccel(i) = XDR_decode_float(PosMsg->angularAccel[i]); motionInfo.angularAccel(i) = XDR_decode_float(PosMsg->angularAccel[i]);
// sanity check: do not allow injection of corrupted data (NaNs)
if (!isSane(motionInfo))
{
// drop this message, keep old position until receiving valid data
SG_LOG(SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::ProcessPosMsg - "
<< "Position message with invalid data (NaN) received from "
<< MsgHdr->Callsign);
return;
}
//cout << "INPUT MESSAGE\n"; //cout << "INPUT MESSAGE\n";
@ -953,7 +992,7 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
SG_LOG(SG_NETWORK, SG_DEBUG, "Unknown Prop type " << pData->id << " " << pData->type); SG_LOG(SG_NETWORK, SG_DEBUG, "Unknown Prop type " << pData->id << " " << pData->type);
xdr++; xdr++;
break; break;
} }
motionInfo.properties.push_back(pData); motionInfo.properties.push_back(pData);
} }

View file

@ -1,6 +1,6 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// //
// multiplaymgr.hpp // multiplaymgr.hxx
// //
// Written by Duncan McCreanor, started February 2003. // Written by Duncan McCreanor, started February 2003.
// duncan.mccreanor@airservicesaustralia.com // duncan.mccreanor@airservicesaustralia.com
@ -81,6 +81,7 @@ private:
void ProcessPosMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress, void ProcessPosMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress,
long stamp); long stamp);
void ProcessChatMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress); void ProcessChatMsg(const MsgBuf& Msg, const simgear::IPAddress& SenderAddress);
bool isSane(const FGExternalMotionData& motionInfo);
/// maps from the callsign string to the FGAIMultiplayer /// maps from the callsign string to the FGAIMultiplayer
typedef std::map<std::string, SGSharedPtr<FGAIMultiplayer> > MultiPlayerMap; typedef std::map<std::string, SGSharedPtr<FGAIMultiplayer> > MultiPlayerMap;