aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Commands
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2021-01-24 16:04:47 +0100
committerShauren <shauren.trinity@gmail.com>2022-03-06 01:35:01 +0100
commita66b968f91d159b149ef5b7357d8a92572cb0b3c (patch)
treecf1e221b668b4ae8eacfff856aea06cac4d8d3c5 /src/server/scripts/Commands
parent91d7a8b06954fa8a2e67166f731644dec1f5e687 (diff)
Core/Misc: Fix static analysis issues (#25924)
* Core/Misc: Fix static analysis issues * Fix infinite loop in ".debug send opcode" Fix using uninitialized memory in ".debug send opcode" (cherry picked from commit 661f554b9e08a3721227f1e4a4fe6fd74e43a1f4)
Diffstat (limited to 'src/server/scripts/Commands')
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp94
1 files changed, 64 insertions, 30 deletions
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 5fc4e46895e..f03829e4642 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -330,49 +330,63 @@ public:
std::stringstream parsedStream;
while (!ifs.eof())
{
- char commentToken[2];
+ char commentToken[2] = {};
ifs.get(commentToken[0]);
- if (commentToken[0] == '/' && !ifs.eof())
+ if (ifs.eof())
+ break;
+ if (commentToken[0] == '/')
{
ifs.get(commentToken[1]);
- // /* comment
- if (commentToken[1] == '*')
+ if (!ifs.eof())
{
- while (!ifs.eof())
+ // /* comment
+ if (commentToken[1] == '*')
{
- ifs.get(commentToken[0]);
- if (commentToken[0] == '*' && !ifs.eof())
+ while (!ifs.eof())
{
- ifs.get(commentToken[1]);
- if (commentToken[1] == '/')
+ ifs.get(commentToken[0]);
+ if (ifs.eof())
break;
- else
- ifs.putback(commentToken[1]);
+ if (commentToken[0] == '*')
+ {
+ ifs.get(commentToken[1]);
+ if (ifs.eof())
+ break;
+ if (commentToken[1] == '/')
+ break;
+ else
+ ifs.putback(commentToken[1]);
+ }
}
+ continue;
}
- continue;
- }
- // line comment
- else if (commentToken[1] == '/')
- {
- std::string str;
- std::getline(ifs, str);
- continue;
+ // line comment
+ else if (commentToken[1] == '/')
+ {
+ std::string str;
+ std::getline(ifs, str);
+ if (ifs.eof())
+ break;
+ continue;
+ }
+ // regular data
+ else
+ ifs.putback(commentToken[1]);
}
- // regular data
- else
- ifs.putback(commentToken[1]);
}
parsedStream.put(commentToken[0]);
}
ifs.close();
- uint32 opcode;
+ uint32 opcode = 0;
parsedStream >> opcode;
+ if (!opcode)
+ return false;
+
WorldPacket data(OpcodeServer(opcode), 0);
- while (!parsedStream.eof())
+ while (!parsedStream.eof() && !parsedStream.fail())
{
std::string type;
parsedStream >> type;
@@ -382,38 +396,59 @@ public:
if (type == "uint8")
{
- uint16 val1;
+ if (parsedStream.eof())
+ return false;
+ uint16 val1 = 0;
parsedStream >> val1;
+ if (parsedStream.fail())
+ return false;
data << uint8(val1);
}
else if (type == "uint16")
{
- uint16 val2;
+ if (parsedStream.eof())
+ return false;
+ uint16 val2 = 0;
parsedStream >> val2;
+ if (parsedStream.fail())
+ return false;
data << val2;
}
else if (type == "uint32")
{
- uint32 val3;
+ if (parsedStream.eof())
+ return false;
+ uint32 val3 = 0;
parsedStream >> val3;
+ if (parsedStream.fail())
+ return false;
data << val3;
}
else if (type == "uint64")
{
- uint64 val4;
+ if (parsedStream.eof())
+ return false;
+ uint64 val4 = 0;
parsedStream >> val4;
+ if (parsedStream.fail())
+ return false;
data << val4;
}
else if (type == "float")
{
- float val5;
+ if (parsedStream.eof())
+ return false;
+ float val5 = 0.0f;
parsedStream >> val5;
+ if (parsedStream.fail())
+ return false;
data << val5;
}
else if (type == "string")
{
std::string val6;
parsedStream >> val6;
+ // empty string is allowed so no need to check eof/fail here
data << val6;
}
else if (type == "goguid")
@@ -423,7 +458,6 @@ public:
{
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, "0");
handler->SetSentErrorMessage(true);
- ifs.close();
return false;
}
data << obj->GetGUID();