diff options
Diffstat (limited to 'indra/llmessage/lltemplatemessagereader.cpp')
| -rw-r--r-- | indra/llmessage/lltemplatemessagereader.cpp | 37 | 
1 files changed, 29 insertions, 8 deletions
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index b62288590e..7798e5692b 100644 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -27,6 +27,10 @@  #include "linden_common.h"  #include "lltemplatemessagereader.h" +#if __FreeBSD__ +#include <arpa/inet.h> +#endif +  #include "llfasttimer.h"  #include "llmessagebuilder.h"  #include "llmessagetemplate.h" @@ -118,6 +122,9 @@ void LLTemplateMessageReader::getData(const char *blockname, const char *varname      {          switch( vardata_size )          { +        case 0: +            // This is here to prevent a memcpy from a null value which is undefined behavior. +            break;          case 1:              *((U8*)datap) = *((U8*)vardata.getData());              break; @@ -286,7 +293,7 @@ void LLTemplateMessageReader::getU8(const char *block, const char *var,  void LLTemplateMessageReader::getBOOL(const char *block, const char *var,                                            bool &b, S32 blocknum )  { -    U8 value; +    U8 value(0);      getData(block, var, &value, sizeof(U8), blocknum);      b = (bool)value;  } @@ -445,7 +452,7 @@ S32 LLTemplateMessageReader::getMessageSize() const  // Returns template for the message contained in buffer  bool LLTemplateMessageReader::decodeTemplate(          const U8* buffer, S32 buffer_size,  // inputs -        LLMessageTemplate** msg_template ) // outputs +        LLMessageTemplate** msg_template, bool custom ) // outputs  {      const U8* header = buffer + LL_PACKET_ID_SIZE; @@ -487,6 +494,7 @@ bool LLTemplateMessageReader::decodeTemplate(      }      else // bogus packet received (too short)      { +        if (!custom)          LL_WARNS() << "Packet with unusable length received (too short): "                  << buffer_size << LL_ENDL;          return(false); @@ -499,9 +507,11 @@ bool LLTemplateMessageReader::decodeTemplate(      }      else      { -        // MAINT-7482 - make viewer more tolerant of unknown messages. +        if (!custom) +        {          LL_WARNS_ONCE() << "Message #" << std::hex << num << std::dec                          << " received but not registered!" << LL_ENDL; +        }          //gMessageSystem->callExceptionFunc(MX_UNREGISTERED_MESSAGE);          return(false);      } @@ -531,7 +541,7 @@ void LLTemplateMessageReader::logRanOffEndOfPacket( const LLHost& host, const S3  static LLTrace::BlockTimerStatHandle FTM_PROCESS_MESSAGES("Process Messages");  // decode a given message -bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender ) +bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender, bool custom )  {      LL_RECORD_BLOCK_TIME(FTM_PROCESS_MESSAGES); @@ -591,6 +601,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender          }          else          { +            if (!custom)              LL_ERRS() << "Unknown block type" << LL_ENDL;              return false;          } @@ -637,6 +648,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender                      if ((decode_pos + data_size) > mReceiveSize)                      { +                        if (!custom)                          logRanOffEndOfPacket(sender, decode_pos, data_size);                          // default to 0 length variable blocks @@ -673,6 +685,7 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender                      // so, copy data pointer and set data size to fixed size                      if ((decode_pos + mvci.getSize()) > mReceiveSize)                      { +                        if (!custom)                          logRanOffEndOfPacket(sender, decode_pos, mvci.getSize());                          // default to 0s. @@ -697,10 +710,11 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender      if (mCurrentRMessageData->mMemberBlocks.empty()          && !mCurrentRMessageTemplate->mMemberBlocks.empty())      { -        LL_DEBUGS() << "Empty message '" << mCurrentRMessageTemplate->mName << "' (no blocks)" << LL_ENDL; +        LL_WARNS() << "Empty message '" << mCurrentRMessageTemplate->mName << "' (no blocks)" << LL_ENDL;          return false;      } +    if (!custom)      {          static LLTimer decode_timer; @@ -753,11 +767,12 @@ bool LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender  bool LLTemplateMessageReader::validateMessage(const U8* buffer,                                                S32 buffer_size,                                                const LLHost& sender, -                                              bool trusted) +                                              bool trusted, +                                              bool custom)  {      mReceiveSize = buffer_size; -    bool valid = decodeTemplate(buffer, buffer_size, &mCurrentRMessageTemplate ); -    if(valid) +    BOOL valid = decodeTemplate(buffer, buffer_size, &mCurrentRMessageTemplate, custom ); +    if(valid && !custom)      {          mCurrentRMessageTemplate->mReceiveCount++;          //LL_DEBUGS() << "MessageRecvd:" @@ -828,3 +843,9 @@ void LLTemplateMessageReader::copyToBuilder(LLMessageBuilder& builder) const      }      builder.copyFromMessageData(*mCurrentRMessageData);  } + +LLMessageTemplate* LLTemplateMessageReader::getTemplate() +{ +    return mCurrentRMessageTemplate; +} +  | 
