diff --git a/src/Message.cpp b/src/Message.cpp index 64fa7950..71369a7f 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -51,7 +51,7 @@ void CMessage::SetCommand(const CString& sCommand) { } 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 ""; } if (uLen > m_vsParams.size() - uIdx - 1) { diff --git a/test/MessageTest.cpp b/test/MessageTest.cpp index f54c4a89..38fb847f 100644 --- a/test/MessageTest.cpp +++ b/test/MessageTest.cpp @@ -72,6 +72,40 @@ TEST(MessageTest, GetParams) { 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) { EXPECT_THAT(CMessage("CMD").GetParamsSplit(0), IsEmpty()); EXPECT_THAT(CMessage("CMD").GetParamsSplit(1), IsEmpty());