Skip to content

Commit a40d2f9

Browse files
committed
[MERGE #2263 @kfarnung] Added a null-terminating character to the character list when scanning a number.
Merge pull request #2263 from kfarnung:ttserialize This ensures that we won't overflow the heap while reading the scanned data.
2 parents dce349e + b252b16 commit a40d2f9

File tree

1 file changed

+5
-11
lines changed

1 file changed

+5
-11
lines changed

lib/Runtime/Debug/TTSerialize.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,9 @@ namespace TTD
872872
charList.Add(c);
873873
}
874874

875+
// Null-terminate the list before we try to use the buffer as a string.
876+
charList.Add(_u('\0'));
877+
875878
bool likelyint; //we don't care about this just want to know that it is convertable to a number
876879
const char16* end;
877880
const char16* start = charList.GetBuffer();
@@ -963,8 +966,8 @@ namespace TTD
963966
return NSTokens::ParseTokenKind::Error;
964967
}
965968

966-
//convert this number to get the length of the string (not including "")
967-
charList.Add(_u('\0'));
969+
// Convert this number to get the length of the string (not including ""),
970+
// charList is already null-terminated by the call to ScanNumber.
968971
uint32 length = (uint32)this->ReadUIntFromCharArray(charList.GetBuffer());
969972

970973
//read the lead "\""
@@ -1226,7 +1229,6 @@ namespace TTD
12261229
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
12271230
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
12281231

1229-
this->m_charListOpt.Add(_u('\0'));
12301232
uint64 uval = this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
12311233
TTDAssert(uval <= BYTE_MAX, "Error in parse.");
12321234

@@ -1250,7 +1252,6 @@ namespace TTD
12501252
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
12511253
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
12521254

1253-
this->m_charListOpt.Add(_u('\0'));
12541255
int64 ival = this->ReadIntFromCharArray(this->m_charListOpt.GetBuffer());
12551256
TTDAssert(INT32_MIN <= ival && ival <= INT32_MAX, "Error in parse.");
12561257

@@ -1264,7 +1265,6 @@ namespace TTD
12641265
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
12651266
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
12661267

1267-
this->m_charListOpt.Add(_u('\0'));
12681268
uint64 uval = this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
12691269
TTDAssert(uval <= UINT32_MAX, "Error in parse.");
12701270

@@ -1278,7 +1278,6 @@ namespace TTD
12781278
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
12791279
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
12801280

1281-
this->m_charListOpt.Add(_u('\0'));
12821281
return this->ReadIntFromCharArray(this->m_charListOpt.GetBuffer());
12831282
}
12841283

@@ -1289,7 +1288,6 @@ namespace TTD
12891288
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
12901289
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
12911290

1292-
this->m_charListOpt.Add(_u('\0'));
12931291
return this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
12941292
}
12951293

@@ -1324,7 +1322,6 @@ namespace TTD
13241322
{
13251323
TTDAssert(tok == NSTokens::ParseTokenKind::Number, "Error in parse.");
13261324

1327-
this->m_charListOpt.Add(_u('\0'));
13281325
res = this->ReadDoubleFromCharArray(this->m_charListOpt.GetBuffer());
13291326

13301327
break;
@@ -1341,7 +1338,6 @@ namespace TTD
13411338
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
13421339
TTDAssert(tok == NSTokens::ParseTokenKind::Address, "Error in parse.");
13431340

1344-
this->m_charListOpt.Add(_u('\0')); //add terminator
13451341
return (TTD_PTR_ID)this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
13461342
}
13471343

@@ -1352,7 +1348,6 @@ namespace TTD
13521348
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
13531349
TTDAssert(tok == NSTokens::ParseTokenKind::LogTag, "Error in parse.");
13541350

1355-
this->m_charListOpt.Add(_u('\0')); //add terminator
13561351
return (TTD_LOG_PTR_ID)this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
13571352
}
13581353

@@ -1363,7 +1358,6 @@ namespace TTD
13631358
NSTokens::ParseTokenKind tok = this->Scan(this->m_charListOpt);
13641359
TTDAssert(tok == NSTokens::ParseTokenKind::EnumTag, "Error in parse.");
13651360

1366-
this->m_charListOpt.Add(_u('\0')); //add terminator
13671361
uint64 tval = this->ReadUIntFromCharArray(this->m_charListOpt.GetBuffer());
13681362
TTDAssert(tval <= UINT32_MAX, "Error in parse.");
13691363

0 commit comments

Comments
 (0)