summaryrefslogtreecommitdiff
path: root/indra/llmessage
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2026-06-13 14:20:22 +0800
committerErik Kundiman <erik@megapahit.org>2026-06-13 17:44:11 +0800
commit191669d38d232d2bd61a0dd2252c7a3543a2b467 (patch)
treec1783f307fd217f38b31cebbe830ba0481925f8a /indra/llmessage
parent47b583e9caa3388cd41f70e8de0a5a950082979d (diff)
parent663bf4d3eba16e1d0a781ac5261541e7e2d6b4f2 (diff)
Merge tag 'Second_Life_Release#663bf4d3-26.3' into 26.3
Diffstat (limited to 'indra/llmessage')
-rw-r--r--indra/llmessage/llassetstorage.cpp3
-rw-r--r--indra/llmessage/lldatapacker.cpp67
-rw-r--r--indra/llmessage/lldatapacker.h8
3 files changed, 59 insertions, 19 deletions
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 4c3acb27f4..b6a98575f9 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -453,6 +453,7 @@ bool LLAssetStorage::findInCacheAndInvokeCallback(const LLUUID& uuid, LLAssetTyp
bool exists = LLFileSystem::getExists(uuid, type);
if (exists)
{
+ LL_PROFILE_ZONE_SCOPED;
LLFileSystem file(uuid, type);
U32 size = file.getSize();
if (size > 0)
@@ -562,7 +563,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid,
if (callback == tmp->mDownCallback && user_data == tmp->mUserData)
{
// this is a duplicate from the same subsystem - throw it away
- LL_WARNS("AssetStorage") << "Discarding duplicate request for asset " << uuid
+ LL_DEBUGS("AssetStorage") << "Discarding duplicate request for asset " << uuid
<< "." << LLAssetType::lookup(type) << LL_ENDL;
return;
}
diff --git a/indra/llmessage/lldatapacker.cpp b/indra/llmessage/lldatapacker.cpp
index e911150787..ecd0b4ee8d 100644
--- a/indra/llmessage/lldatapacker.cpp
+++ b/indra/llmessage/lldatapacker.cpp
@@ -289,32 +289,46 @@ bool LLDataPackerBinaryBuffer::packBinaryData(const U8 *value, S32 size, const c
}
-bool LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 &size, const char *name)
+bool LLDataPackerBinaryBuffer::unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name)
{
if (!verifyLength(4, name))
{
LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData would unpack invalid data, aborting!" << LL_ENDL;
+ out_size = 0;
return false;
}
- htolememcpy(&size, mCurBufferp, MVT_S32, 4);
+ if (value_size < 0)
+ {
+ LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData passed negative buffer size, aborting!" << LL_ENDL;
+ out_size = 0;
+ return false;
+ }
+
+ htolememcpy(&out_size, mCurBufferp, MVT_S32, 4);
- if (size < 0)
+ if (out_size < 0)
{
LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData unpacked invalid size, aborting!" << LL_ENDL;
+ out_size = 0;
return false;
}
mCurBufferp += 4;
- if (!verifyLength(size, name))
+ if (!verifyLength(out_size, name))
{
LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData would unpack invalid data, aborting!" << LL_ENDL;
return false;
}
+ S32 copy_size = llmin(out_size, value_size);
+ htolememcpy(value, mCurBufferp, MVT_VARIABLE, copy_size);
+ mCurBufferp += out_size;
- htolememcpy(value, mCurBufferp, MVT_VARIABLE, size);
- mCurBufferp += size;
+ if (value_size < out_size)
+ {
+ LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData buffer too small for data, truncating!" << LL_ENDL;
+ }
return true;
}
@@ -836,21 +850,34 @@ bool LLDataPackerAsciiBuffer::packBinaryData(const U8 *value, S32 size, const ch
}
-bool LLDataPackerAsciiBuffer::unpackBinaryData(U8 *value, S32 &size, const char *name)
+bool LLDataPackerAsciiBuffer::unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name)
{
bool success = true;
char valuestr[DP_BUFSIZE]; /* Flawfinder: ignore */
if (!getValueStr(name, valuestr, DP_BUFSIZE))
{
+ out_size = 0;
+ return false;
+ }
+
+ if (value_size < 0)
+ {
+ LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData passed negative buffer size, aborting!" << LL_ENDL;
+ out_size = 0;
return false;
}
char *cur_pos = &valuestr[0];
- sscanf(valuestr,"%010d", &size);
+ sscanf(valuestr,"%010d", &out_size);
cur_pos += 11;
+ S32 max_bytes = llmin(out_size, value_size);
+ if (max_bytes != out_size)
+ {
+ LL_WARNS() << "LLDataPackerAsciiBuffer::unpackBinaryData: buffer too small for data, truncating!" << LL_ENDL;
+ }
S32 i;
- for (i = 0; i < size; i++)
+ for (i = 0; i < max_bytes; i++)
{
S32 val;
sscanf(cur_pos,"%02x", &val);
@@ -1634,28 +1661,40 @@ bool LLDataPackerAsciiFile::packBinaryData(const U8 *value, S32 size, const char
}
-bool LLDataPackerAsciiFile::unpackBinaryData(U8 *value, S32 &size, const char *name)
+bool LLDataPackerAsciiFile::unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name)
{
- bool success = true;
char valuestr[DP_BUFSIZE]; /*Flawfinder: ignore*/
if (!getValueStr(name, valuestr, DP_BUFSIZE))
{
+ out_size = 0;
+ return false;
+ }
+
+ if (value_size < 0)
+ {
+ LL_WARNS() << "LLDataPackerBinaryBuffer::unpackBinaryData passed negative buffer size, aborting!" << LL_ENDL;
+ out_size = 0;
return false;
}
char *cur_pos = &valuestr[0];
- sscanf(valuestr,"%010d", &size);
+ sscanf(valuestr,"%010d", &out_size);
cur_pos += 11;
+ S32 max_bytes = llmin(out_size, value_size);
+ if (max_bytes != out_size)
+ {
+ LL_WARNS() << "LLDataPackerAsciiBuffer::unpackBinaryData: buffer too small for data, truncating!" << LL_ENDL;
+ }
S32 i;
- for (i = 0; i < size; i++)
+ for (i = 0; i < max_bytes; i++)
{
S32 val;
sscanf(cur_pos,"%02x", &val);
value[i] = val;
cur_pos += 3;
}
- return success;
+ return true;
}
diff --git a/indra/llmessage/lldatapacker.h b/indra/llmessage/lldatapacker.h
index 167c102b43..5ac45356cf 100644
--- a/indra/llmessage/lldatapacker.h
+++ b/indra/llmessage/lldatapacker.h
@@ -49,7 +49,7 @@ public:
virtual bool unpackString(std::string& value, const char *name) = 0;
virtual bool packBinaryData(const U8 *value, S32 size, const char *name) = 0;
- virtual bool unpackBinaryData(U8 *value, S32 &size, const char *name) = 0;
+ virtual bool unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name) = 0;
// Constant size binary data packing
virtual bool packBinaryDataFixed(const U8 *value, S32 size, const char *name) = 0;
@@ -135,7 +135,7 @@ public:
/*virtual*/ bool unpackString(std::string& value, const char *name);
/*virtual*/ bool packBinaryData(const U8 *value, S32 size, const char *name);
- /*virtual*/ bool unpackBinaryData(U8 *value, S32 &size, const char *name);
+ /*virtual*/ bool unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name);
// Constant size binary data packing
/*virtual*/ bool packBinaryDataFixed(const U8 *value, S32 size, const char *name);
@@ -246,7 +246,7 @@ public:
/*virtual*/ bool unpackString(std::string& value, const char *name);
/*virtual*/ bool packBinaryData(const U8 *value, S32 size, const char *name);
- /*virtual*/ bool unpackBinaryData(U8 *value, S32 &size, const char *name);
+ /*virtual*/ bool unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name);
// Constant size binary data packing
/*virtual*/ bool packBinaryDataFixed(const U8 *value, S32 size, const char *name);
@@ -378,7 +378,7 @@ public:
/*virtual*/ bool unpackString(std::string& value, const char *name);
/*virtual*/ bool packBinaryData(const U8 *value, S32 size, const char *name);
- /*virtual*/ bool unpackBinaryData(U8 *value, S32 &size, const char *name);
+ /*virtual*/ bool unpackBinaryData(U8 *value, S32 value_size, S32 &out_size, const char *name);
/*virtual*/ bool packBinaryDataFixed(const U8 *value, S32 size, const char *name);
/*virtual*/ bool unpackBinaryDataFixed(U8 *value, S32 size, const char *name);