diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2021-01-24 16:04:47 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-06 01:35:01 +0100 |
commit | a66b968f91d159b149ef5b7357d8a92572cb0b3c (patch) | |
tree | cf1e221b668b4ae8eacfff856aea06cac4d8d3c5 /src/server/scripts/Commands | |
parent | 91d7a8b06954fa8a2e67166f731644dec1f5e687 (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.cpp | 94 |
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(); |