Merge pull request #1995 from jabberwock/fix/getparamscolon-bounds-check

Message: add bounds check in GetParamsColon when uIdx >= params.size()
This commit is contained in:
Alexey Sokolov
2026-03-17 18:05:39 +00:00
committed by GitHub
2 changed files with 35 additions and 1 deletions

View File

@@ -51,7 +51,7 @@ void CMessage::SetCommand(const CString& sCommand) {
} }
CString CMessage::GetParamsColon(unsigned int uIdx, unsigned int uLen) const { CString CMessage::GetParamsColon(unsigned int uIdx, unsigned int uLen) const {
if (m_vsParams.empty() || uLen == 0) { if (m_vsParams.empty() || uLen == 0 || uIdx >= m_vsParams.size()) {
return ""; return "";
} }
if (uLen > m_vsParams.size() - uIdx - 1) { if (uLen > m_vsParams.size() - uIdx - 1) {

View File

@@ -72,6 +72,40 @@ TEST(MessageTest, GetParams) {
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParams(-1, 10), ""); EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParams(-1, 10), "");
} }
TEST(MessageTest, GetParamsColon) {
EXPECT_EQ(CMessage("CMD").GetParamsColon(0), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(1), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(-1), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(0, 0), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(1, 0), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(-1, 0), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(0, 1), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(1, 1), "");
EXPECT_EQ(CMessage("CMD").GetParamsColon(-1, 1), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(0), "p1 :p2 p3");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(1), ":p2 p3");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(-1), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(0, 0), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(1, 0), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(-1, 0), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(0, 1), "p1");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(1, 1), ":p2 p3");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(-1, 1), "");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(0, 10), "p1 :p2 p3");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(1, 10), ":p2 p3");
EXPECT_EQ(CMessage("CMD p1 :p2 p3").GetParamsColon(-1, 10), "");
// uIdx past the end must return "" without undefined behaviour (#1994)
EXPECT_EQ(CMessage("MODE #chan +b").GetParamsColon(2, 1), "");
EXPECT_EQ(CMessage("MODE #chan +b").GetParamsColon(3, 1), "");
}
TEST(MessageTest, GetParamsSplit) { TEST(MessageTest, GetParamsSplit) {
EXPECT_THAT(CMessage("CMD").GetParamsSplit(0), IsEmpty()); EXPECT_THAT(CMessage("CMD").GetParamsSplit(0), IsEmpty());
EXPECT_THAT(CMessage("CMD").GetParamsSplit(1), IsEmpty()); EXPECT_THAT(CMessage("CMD").GetParamsSplit(1), IsEmpty());