Commit b130811c authored by Eric Orth's avatar Eric Orth Committed by Commit Bot

Fix bad cast of malformed https rdata

Another case of the apparently poor job I did adding in the malformed
vairant of HttpsRecordRdata.  ServiceFormHttpsRecordRdata::IsEqual() did
not check if the input was malformed before casting to service form. Fix
is to check before casting, and also to use the AsServiceForm() helper
instead of a raw cast, as the helper has the CHECKs designed to make
bugs like this obvious.

Fixed: 1146873
Change-Id: I5222a09c9c032bc163ca1beebf4bf1e0504ccad6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2526931
Commit-Queue: Eric Orth <ericorth@chromium.org>
Commit-Queue: Dan McArdle <dmcardle@chromium.org>
Auto-Submit: Eric Orth <ericorth@chromium.org>
Reviewed-by: default avatarDan McArdle <dmcardle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825500}
parent 24d7bd86
...@@ -240,8 +240,7 @@ bool AliasFormHttpsRecordRdata::IsEqual(const HttpsRecordRdata* other) const { ...@@ -240,8 +240,7 @@ bool AliasFormHttpsRecordRdata::IsEqual(const HttpsRecordRdata* other) const {
if (!other->IsAlias()) if (!other->IsAlias())
return false; return false;
const AliasFormHttpsRecordRdata* alias = const AliasFormHttpsRecordRdata* alias = other->AsAliasForm();
static_cast<const AliasFormHttpsRecordRdata*>(other);
return alias_name_ == alias->alias_name_; return alias_name_ == alias->alias_name_;
} }
...@@ -295,11 +294,10 @@ ServiceFormHttpsRecordRdata::~ServiceFormHttpsRecordRdata() = default; ...@@ -295,11 +294,10 @@ ServiceFormHttpsRecordRdata::~ServiceFormHttpsRecordRdata() = default;
bool ServiceFormHttpsRecordRdata::IsEqual(const HttpsRecordRdata* other) const { bool ServiceFormHttpsRecordRdata::IsEqual(const HttpsRecordRdata* other) const {
DCHECK(other); DCHECK(other);
if (other->IsAlias()) if (other->IsAlias() || other->IsMalformed())
return false; return false;
const ServiceFormHttpsRecordRdata* service = const ServiceFormHttpsRecordRdata* service = other->AsServiceForm();
static_cast<const ServiceFormHttpsRecordRdata*>(other);
return priority_ == service->priority_ && return priority_ == service->priority_ &&
service_name_ == service->service_name_ && service_name_ == service->service_name_ &&
mandatory_keys_ == service->mandatory_keys_ && mandatory_keys_ == service->mandatory_keys_ &&
......
...@@ -156,5 +156,47 @@ TEST(HttpsRecordRdataTest, RejectCorruptRdata) { ...@@ -156,5 +156,47 @@ TEST(HttpsRecordRdataTest, RejectCorruptRdata) {
EXPECT_TRUE(rdata->IsMalformed()); EXPECT_TRUE(rdata->IsMalformed());
} }
TEST(HttpsRecordRdataTest, AliasIsEqualRejectsWrongType) {
AliasFormHttpsRecordRdata alias("alias.name.test");
ServiceFormHttpsRecordRdata service(
1u /* priority */, "service.name.test", {} /* mandatory_keys */,
{} /* alpn_ids */, true /* default_alpn */, base::nullopt /* port */,
{} /* ipv4_hint */, "" /* ech_config */, {} /* ipv6_hint */,
{} /* unparsed_params */);
MalformedHttpsRecordRdata malformed;
EXPECT_TRUE(alias.IsEqual(&alias));
EXPECT_FALSE(alias.IsEqual(&service));
EXPECT_FALSE(alias.IsEqual(&malformed));
}
TEST(HttpsRecordRdataTest, ServiceIsEqualRejectsWrongType) {
AliasFormHttpsRecordRdata alias("alias.name.test");
ServiceFormHttpsRecordRdata service(
1u /* priority */, "service.name.test", {} /* mandatory_keys */,
{} /* alpn_ids */, true /* default_alpn */, base::nullopt /* port */,
{} /* ipv4_hint */, "" /* ech_config */, {} /* ipv6_hint */,
{} /* unparsed_params */);
MalformedHttpsRecordRdata malformed;
EXPECT_FALSE(service.IsEqual(&alias));
EXPECT_TRUE(service.IsEqual(&service));
EXPECT_FALSE(service.IsEqual(&malformed));
}
TEST(HttpsRecordRdataTest, MalformedIsEqualRejectsWrongType) {
AliasFormHttpsRecordRdata alias("alias.name.test");
ServiceFormHttpsRecordRdata service(
1u /* priority */, "service.name.test", {} /* mandatory_keys */,
{} /* alpn_ids */, true /* default_alpn */, base::nullopt /* port */,
{} /* ipv4_hint */, "" /* ech_config */, {} /* ipv6_hint */,
{} /* unparsed_params */);
MalformedHttpsRecordRdata malformed;
EXPECT_FALSE(malformed.IsEqual(&alias));
EXPECT_FALSE(malformed.IsEqual(&service));
EXPECT_TRUE(malformed.IsEqual(&malformed));
}
} // namespace } // namespace
} // namespace net } // namespace net
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment