Skip to content
Snippets Groups Projects
Commit d4d5d401 authored by Andrey Lihatskiy's avatar Andrey Lihatskiy
Browse files

Merge remote-tracking branch...

Merge remote-tracking branch 'RyeMutt/viewer/datapacker-crashfixes/datapacker-crashfixes' into DRTVWR-570-maint-Q
parents 91f9f2e9 129301c8
No related branches found
No related tags found
No related merge requests found
...@@ -1391,6 +1391,7 @@ Sovereign Engineer ...@@ -1391,6 +1391,7 @@ Sovereign Engineer
SL-18249 SL-18249
SL-18394 SL-18394
SL-18412 SL-18412
SL-18497
SpacedOut Frye SpacedOut Frye
VWR-34 VWR-34
VWR-45 VWR-45
......
This diff is collapsed.
...@@ -116,9 +116,8 @@ BOOL LLDataPacker::packFixed(const F32 value, const char *name, ...@@ -116,9 +116,8 @@ BOOL LLDataPacker::packFixed(const F32 value, const char *name,
BOOL LLDataPacker::unpackFixed(F32 &value, const char *name, BOOL LLDataPacker::unpackFixed(F32 &value, const char *name,
const BOOL is_signed, const U32 int_bits, const U32 frac_bits) const BOOL is_signed, const U32 int_bits, const U32 frac_bits)
{ {
//BOOL success = TRUE; BOOL success = TRUE;
//LL_INFOS() << "unpackFixed:" << name << " int:" << int_bits << " frac:" << frac_bits << LL_ENDL; //LL_INFOS() << "unpackFixed:" << name << " int:" << int_bits << " frac:" << frac_bits << LL_ENDL;
BOOL ok = FALSE;
S32 unsigned_bits = int_bits + frac_bits; S32 unsigned_bits = int_bits + frac_bits;
S32 total_bits = unsigned_bits; S32 total_bits = unsigned_bits;
...@@ -134,19 +133,19 @@ BOOL LLDataPacker::unpackFixed(F32 &value, const char *name, ...@@ -134,19 +133,19 @@ BOOL LLDataPacker::unpackFixed(F32 &value, const char *name,
if (total_bits <= 8) if (total_bits <= 8)
{ {
U8 fixed_8; U8 fixed_8;
ok = unpackU8(fixed_8, name); success = unpackU8(fixed_8, name);
fixed_val = (F32)fixed_8; fixed_val = (F32)fixed_8;
} }
else if (total_bits <= 16) else if (total_bits <= 16)
{ {
U16 fixed_16; U16 fixed_16;
ok = unpackU16(fixed_16, name); success = unpackU16(fixed_16, name);
fixed_val = (F32)fixed_16; fixed_val = (F32)fixed_16;
} }
else if (total_bits <= 31) else if (total_bits <= 31)
{ {
U32 fixed_32; U32 fixed_32;
ok = unpackU32(fixed_32, name); success = unpackU32(fixed_32, name);
fixed_val = (F32)fixed_32; fixed_val = (F32)fixed_32;
} }
else else
...@@ -164,7 +163,7 @@ BOOL LLDataPacker::unpackFixed(F32 &value, const char *name, ...@@ -164,7 +163,7 @@ BOOL LLDataPacker::unpackFixed(F32 &value, const char *name,
} }
value = fixed_val; value = fixed_val;
//LL_INFOS() << "Value: " << value << LL_ENDL; //LL_INFOS() << "Value: " << value << LL_ENDL;
return ok; return success;
} }
BOOL LLDataPacker::unpackU16s(U16 *values, S32 count, const char *name) BOOL LLDataPacker::unpackU16s(U16 *values, S32 count, const char *name)
...@@ -238,37 +237,43 @@ BOOL LLDataPacker::unpackUUIDs(LLUUID *values, S32 count, const char *name) ...@@ -238,37 +237,43 @@ BOOL LLDataPacker::unpackUUIDs(LLUUID *values, S32 count, const char *name)
BOOL LLDataPackerBinaryBuffer::packString(const std::string& value, const char *name) BOOL LLDataPackerBinaryBuffer::packString(const std::string& value, const char *name)
{ {
BOOL success = TRUE;
S32 length = value.length()+1; S32 length = value.length()+1;
success &= verifyLength(length, name); if (!verifyLength(length, name))
{
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.c_str(), MVT_VARIABLE, length); htolememcpy(mCurBufferp, value.c_str(), MVT_VARIABLE, length);
} }
mCurBufferp += length; mCurBufferp += length;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackString(std::string& value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackString(std::string& value, const char *name)
{ {
BOOL success = TRUE;
S32 length = (S32)strlen((char *)mCurBufferp) + 1; /*Flawfinder: ignore*/ S32 length = (S32)strlen((char *)mCurBufferp) + 1; /*Flawfinder: ignore*/
success &= verifyLength(length, name); if (!verifyLength(length, name))
{
return FALSE;
}
value = std::string((char*)mCurBufferp); // We already assume NULL termination calling strlen() value = std::string((char*)mCurBufferp); // We already assume NULL termination calling strlen()
mCurBufferp += length; mCurBufferp += length;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const char *name) BOOL LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(size + 4, name))
success &= verifyLength(size + 4, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
...@@ -280,102 +285,117 @@ BOOL LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const c ...@@ -280,102 +285,117 @@ BOOL LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const c
htolememcpy(mCurBufferp, value, MVT_VARIABLE, size); htolememcpy(mCurBufferp, value, MVT_VARIABLE, size);
} }
mCurBufferp += size; mCurBufferp += size;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 &size, const char *name) BOOL LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 &size, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(4, name))
success &= verifyLength(4, name);
htolememcpy(&size, mCurBufferp, MVT_S32, 4);
mCurBufferp += 4;
success &= verifyLength(size, name);
if (success)
{ {
htolememcpy(value, mCurBufferp, MVT_VARIABLE, size); LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData would unpack invalid data, aborting!" << LL_ENDL;
mCurBufferp += size; return FALSE;
} }
else
htolememcpy(&size, mCurBufferp, MVT_S32, 4);
mCurBufferp += 4;
if (!verifyLength(size, name))
{ {
LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData would unpack invalid data, aborting!" << LL_ENDL; LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData would unpack invalid data, aborting!" << LL_ENDL;
success = FALSE; return FALSE;
} }
return success;
htolememcpy(value, mCurBufferp, MVT_VARIABLE, size);
mCurBufferp += size;
return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packBinaryDataFixed(const U8 *value, S32 size, const char *name) BOOL LLDataPackerBinaryBuffer::packBinaryDataFixed(const U8 *value, S32 size, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(size, name))
success &= verifyLength(size, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value, MVT_VARIABLE, size); htolememcpy(mCurBufferp, value, MVT_VARIABLE, size);
} }
mCurBufferp += size; mCurBufferp += size;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackBinaryDataFixed(U8 *value, S32 size, const char *name) BOOL LLDataPackerBinaryBuffer::unpackBinaryDataFixed(U8 *value, S32 size, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(size, name))
success &= verifyLength(size, name); {
return FALSE;
}
htolememcpy(value, mCurBufferp, MVT_VARIABLE, size); htolememcpy(value, mCurBufferp, MVT_VARIABLE, size);
mCurBufferp += size; mCurBufferp += size;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packU8(const U8 value, const char *name) BOOL LLDataPackerBinaryBuffer::packU8(const U8 value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U8), name))
success &= verifyLength(sizeof(U8), name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
*mCurBufferp = value; *mCurBufferp = value;
} }
mCurBufferp++; mCurBufferp++;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackU8(U8 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackU8(U8 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U8), name))
success &= verifyLength(sizeof(U8), name); {
return FALSE;
}
value = *mCurBufferp; value = *mCurBufferp;
mCurBufferp++; mCurBufferp++;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packU16(const U16 value, const char *name) BOOL LLDataPackerBinaryBuffer::packU16(const U16 value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U16), name))
success &= verifyLength(sizeof(U16), name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, &value, MVT_U16, 2); htolememcpy(mCurBufferp, &value, MVT_U16, 2);
} }
mCurBufferp += 2; mCurBufferp += 2;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackU16(U16 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackU16(U16 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U16), name))
success &= verifyLength(sizeof(U16), name); {
return FALSE;
}
htolememcpy(&value, mCurBufferp, MVT_U16, 2); htolememcpy(&value, mCurBufferp, MVT_U16, 2);
mCurBufferp += 2; mCurBufferp += 2;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packS16(const S16 value, const char *name) BOOL LLDataPackerBinaryBuffer::packS16(const S16 value, const char *name)
...@@ -404,134 +424,156 @@ BOOL LLDataPackerBinaryBuffer::unpackS16(S16 &value, const char *name) ...@@ -404,134 +424,156 @@ BOOL LLDataPackerBinaryBuffer::unpackS16(S16 &value, const char *name)
BOOL LLDataPackerBinaryBuffer::packU32(const U32 value, const char *name) BOOL LLDataPackerBinaryBuffer::packU32(const U32 value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U32), name))
success &= verifyLength(sizeof(U32), name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, &value, MVT_U32, 4); htolememcpy(mCurBufferp, &value, MVT_U32, 4);
} }
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackU32(U32 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackU32(U32 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(U32), name))
success &= verifyLength(sizeof(U32), name); {
return FALSE;
}
htolememcpy(&value, mCurBufferp, MVT_U32, 4); htolememcpy(&value, mCurBufferp, MVT_U32, 4);
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packS32(const S32 value, const char *name) BOOL LLDataPackerBinaryBuffer::packS32(const S32 value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(S32), name))
success &= verifyLength(sizeof(S32), name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, &value, MVT_S32, 4); htolememcpy(mCurBufferp, &value, MVT_S32, 4);
} }
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackS32(S32 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackS32(S32 &value, const char *name)
{ {
BOOL success = TRUE; if(!verifyLength(sizeof(S32), name))
success &= verifyLength(sizeof(S32), name); {
return FALSE;
}
htolememcpy(&value, mCurBufferp, MVT_S32, 4); htolememcpy(&value, mCurBufferp, MVT_S32, 4);
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packF32(const F32 value, const char *name) BOOL LLDataPackerBinaryBuffer::packF32(const F32 value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(F32), name))
success &= verifyLength(sizeof(F32), name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, &value, MVT_F32, 4); htolememcpy(mCurBufferp, &value, MVT_F32, 4);
} }
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackF32(F32 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackF32(F32 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(sizeof(F32), name))
success &= verifyLength(sizeof(F32), name); {
return FALSE;
}
htolememcpy(&value, mCurBufferp, MVT_F32, 4); htolememcpy(&value, mCurBufferp, MVT_F32, 4);
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packColor4(const LLColor4 &value, const char *name) BOOL LLDataPackerBinaryBuffer::packColor4(const LLColor4 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16); htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
} }
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackColor4(LLColor4 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackColor4(LLColor4 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16); htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packColor4U(const LLColor4U &value, const char *name) BOOL LLDataPackerBinaryBuffer::packColor4U(const LLColor4U &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(4, name))
success &= verifyLength(4, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.mV, MVT_VARIABLE, 4); htolememcpy(mCurBufferp, value.mV, MVT_VARIABLE, 4);
} }
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackColor4U(LLColor4U &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackColor4U(LLColor4U &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(4, name))
success &= verifyLength(4, name); {
return FALSE;
}
htolememcpy(value.mV, mCurBufferp, MVT_VARIABLE, 4); htolememcpy(value.mV, mCurBufferp, MVT_VARIABLE, 4);
mCurBufferp += 4; mCurBufferp += 4;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packVector2(const LLVector2 &value, const char *name) BOOL LLDataPackerBinaryBuffer::packVector2(const LLVector2 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(8, name))
success &= verifyLength(8, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
...@@ -539,92 +581,106 @@ BOOL LLDataPackerBinaryBuffer::packVector2(const LLVector2 &value, const char *n ...@@ -539,92 +581,106 @@ BOOL LLDataPackerBinaryBuffer::packVector2(const LLVector2 &value, const char *n
htolememcpy(mCurBufferp+4, &value.mV[1], MVT_F32, 4); htolememcpy(mCurBufferp+4, &value.mV[1], MVT_F32, 4);
} }
mCurBufferp += 8; mCurBufferp += 8;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackVector2(LLVector2 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackVector2(LLVector2 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(8, name))
success &= verifyLength(8, name); {
return FALSE;
}
htolememcpy(&value.mV[0], mCurBufferp, MVT_F32, 4); htolememcpy(&value.mV[0], mCurBufferp, MVT_F32, 4);
htolememcpy(&value.mV[1], mCurBufferp+4, MVT_F32, 4); htolememcpy(&value.mV[1], mCurBufferp+4, MVT_F32, 4);
mCurBufferp += 8; mCurBufferp += 8;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packVector3(const LLVector3 &value, const char *name) BOOL LLDataPackerBinaryBuffer::packVector3(const LLVector3 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(12, name))
success &= verifyLength(12, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.mV, MVT_LLVector3, 12); htolememcpy(mCurBufferp, value.mV, MVT_LLVector3, 12);
} }
mCurBufferp += 12; mCurBufferp += 12;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackVector3(LLVector3 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackVector3(LLVector3 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(12, name))
success &= verifyLength(12, name); {
return FALSE;
}
htolememcpy(value.mV, mCurBufferp, MVT_LLVector3, 12); htolememcpy(value.mV, mCurBufferp, MVT_LLVector3, 12);
mCurBufferp += 12; mCurBufferp += 12;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packVector4(const LLVector4 &value, const char *name) BOOL LLDataPackerBinaryBuffer::packVector4(const LLVector4 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16); htolememcpy(mCurBufferp, value.mV, MVT_LLVector4, 16);
} }
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackVector4(LLVector4 &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackVector4(LLVector4 &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16); htolememcpy(value.mV, mCurBufferp, MVT_LLVector4, 16);
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::packUUID(const LLUUID &value, const char *name) BOOL LLDataPackerBinaryBuffer::packUUID(const LLUUID &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
if (mWriteEnabled) if (mWriteEnabled)
{ {
htolememcpy(mCurBufferp, value.mData, MVT_LLUUID, 16); htolememcpy(mCurBufferp, value.mData, MVT_LLUUID, 16);
} }
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
BOOL LLDataPackerBinaryBuffer::unpackUUID(LLUUID &value, const char *name) BOOL LLDataPackerBinaryBuffer::unpackUUID(LLUUID &value, const char *name)
{ {
BOOL success = TRUE; if (!verifyLength(16, name))
success &= verifyLength(16, name); {
return FALSE;
}
htolememcpy(value.mData, mCurBufferp, MVT_LLUUID, 16); htolememcpy(value.mData, mCurBufferp, MVT_LLUUID, 16);
mCurBufferp += 16; mCurBufferp += 16;
return success; return TRUE;
} }
const LLDataPackerBinaryBuffer& LLDataPackerBinaryBuffer::operator=(const LLDataPackerBinaryBuffer &a) const LLDataPackerBinaryBuffer& LLDataPackerBinaryBuffer::operator=(const LLDataPackerBinaryBuffer &a)
...@@ -698,15 +754,13 @@ BOOL LLDataPackerAsciiBuffer::packString(const std::string& value, const char *n ...@@ -698,15 +754,13 @@ BOOL LLDataPackerAsciiBuffer::packString(const std::string& value, const char *n
BOOL LLDataPackerAsciiBuffer::unpackString(std::string& value, const char *name) BOOL LLDataPackerAsciiBuffer::unpackString(std::string& value, const char *name)
{ {
BOOL success = TRUE;
char valuestr[DP_BUFSIZE]; /*Flawfinder: ignore*/ char valuestr[DP_BUFSIZE]; /*Flawfinder: ignore*/
BOOL res = getValueStr(name, valuestr, DP_BUFSIZE); // NULL terminated if (!getValueStr(name, valuestr, DP_BUFSIZE)) // NULL terminated
if (!res) //
{ {
return FALSE; return FALSE;
} }
value = valuestr; value = valuestr;
return success; return TRUE;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment