xref: /aosp_15_r20/external/cronet/net/base/schemeful_site_fuzzer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/schemeful_site.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <iostream>
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <string>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "testing/libfuzzer/proto/lpm_interface.h"
14*6777b538SAndroid Build Coastguard Worker #include "testing/libfuzzer/proto/url.pb.h"
15*6777b538SAndroid Build Coastguard Worker #include "testing/libfuzzer/proto/url_proto_converter.h"
16*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h"
17*6777b538SAndroid Build Coastguard Worker #include "url/origin.h"
18*6777b538SAndroid Build Coastguard Worker 
DEFINE_PROTO_FUZZER(const url_proto::Url & url_message)19*6777b538SAndroid Build Coastguard Worker DEFINE_PROTO_FUZZER(const url_proto::Url& url_message) {
20*6777b538SAndroid Build Coastguard Worker   std::string native_input = url_proto::Convert(url_message);
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker   if (getenv("LPM_DUMP_NATIVE_INPUT"))
23*6777b538SAndroid Build Coastguard Worker     std::cout << native_input << std::endl;
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   url::Origin origin = url::Origin::Create((GURL(native_input)));
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   // We don't run the fuzzer on inputs whose hosts will contain "..". The ".."
28*6777b538SAndroid Build Coastguard Worker   // causes SchemefulSite to consider the registrable domain to start with the
29*6777b538SAndroid Build Coastguard Worker   // second ".".
30*6777b538SAndroid Build Coastguard Worker   if (origin.host().find("..") != std::string::npos)
31*6777b538SAndroid Build Coastguard Worker     return;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   net::SchemefulSite site(origin);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   std::optional<net::SchemefulSite> site_with_registrable_domain =
36*6777b538SAndroid Build Coastguard Worker       net::SchemefulSite::CreateIfHasRegisterableDomain(origin);
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   if (site_with_registrable_domain) {
39*6777b538SAndroid Build Coastguard Worker     CHECK_EQ(site_with_registrable_domain->GetInternalOriginForTesting(),
40*6777b538SAndroid Build Coastguard Worker              site.GetInternalOriginForTesting());
41*6777b538SAndroid Build Coastguard Worker     CHECK(site.has_registrable_domain_or_host());
42*6777b538SAndroid Build Coastguard Worker     const std::string& scheme = site.GetInternalOriginForTesting().scheme();
43*6777b538SAndroid Build Coastguard Worker     if (scheme == "http" || scheme == "https") {
44*6777b538SAndroid Build Coastguard Worker       CHECK_NE(site.registrable_domain_or_host_for_testing().front(), '.');
45*6777b538SAndroid Build Coastguard Worker     }
46*6777b538SAndroid Build Coastguard Worker   }
47*6777b538SAndroid Build Coastguard Worker }
48