diff --git a/folly/IPAddressV6.cpp b/folly/IPAddressV6.cpp index c32d782adb2..4eb043a096f 100644 --- a/folly/IPAddressV6.cpp +++ b/folly/IPAddressV6.cpp @@ -230,7 +230,13 @@ IPAddressV6 IPAddressV6::fromInverseArpaName(const std::string& arpaname) { size_t pos = 0; int count = 0; for (size_t i = 1; i <= pieces.size(); i++) { - ip[pos] = pieces[pieces.size() - i][0]; + // Each label is a single hex digit; IPAddressV6 checks that it is hex. + auto const label = pieces[pieces.size() - i]; + if (label.size() != 1) { + throw IPAddressFormatException( + fmt::format("Invalid input. Got '{}'", piece)); + } + ip[pos] = label[0]; pos++; count++; // add ':' every 4 chars diff --git a/folly/test/IPAddressTest.cpp b/folly/test/IPAddressTest.cpp index a6ac55739ae..7c46a4a469a 100644 --- a/folly/test/IPAddressTest.cpp +++ b/folly/test/IPAddressTest.cpp @@ -776,6 +776,19 @@ TEST(IPaddress, fromInverseArpaName) { fmt::format( "{}.ip6.arpa", "3.0.0.0.0.0.0.0.0.0.0.0.c.0.0.b.e.c.a.f.e.f.c.1.0.0.0.0.0.2.6.2"))); + // Each label must be exactly one hex digit. + EXPECT_THROW( + IPAddressV6::fromInverseArpaName( + fmt::format( + "{}.ip6.arpa", + "30.0.0.0.0.0.0.0.0.0.0.0.c.0.0.b.e.c.a.f.e.f.c.1.0.0.0.0.0.2.6.2")), + IPAddressFormatException); + EXPECT_THROW( + IPAddressV6::fromInverseArpaName( + fmt::format( + "{}.ip6.arpa", + ".0.0.0.0.0.0.0.0.0.0.0.c.0.0.b.e.c.a.f.e.f.c.1.0.0.0.0.0.2.6.2")), + IPAddressFormatException); } // Test that invalid string values are killed