Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/base/mime_sniffer.h" | |
| 6 | |
| 7 #include <stddef.h> | |
| 8 #include <stdint.h> | |
| 9 | |
| 10 #include <string> | |
| 11 | |
| 12 #include "base/strings/string_piece.h" | |
| 13 #include "url/gurl.h" | |
| 14 | |
| 15 namespace { | |
| 16 | |
| 17 // Finds the line break in |string_piece|, removes every up to and including the | |
|
eroman
2016/03/28 21:00:25
This comment is missing something.
removes everyt
mmenke
2016/03/28 21:22:04
Oops. Done. Rewrote this method just a few times
| |
| 18 // line break from |string_piece|, and returns all the | |
|
eroman
2016/03/28 21:00:26
Almost like you ended your thought before -
the
mmenke
2016/03/28 21:22:04
That's just silly. The pterodactyl was a Deceptic
| |
| 19 std::string GetNextArgument(base::StringPiece* string_piece) { | |
|
eroman
2016/03/28 21:00:25
not a fan of name "string_piece"
|input| would be
mmenke
2016/03/28 21:22:04
Done.
| |
| 20 base::StringPiece::size_type argument_end = string_piece->find('\n'); | |
| 21 if (argument_end == base::StringPiece::npos) | |
| 22 argument_end = string_piece->size(); | |
| 23 base::StringPiece argument = string_piece->substr(0, argument_end); | |
| 24 *string_piece = string_piece->substr(argument_end + 1); | |
| 25 return argument.as_string(); | |
| 26 } | |
| 27 | |
| 28 } // namespace | |
| 29 | |
| 30 // Fuzzer for the three main mime sniffing functions: | |
| 31 // ShouldSniffMimeType, SniffMimeType, and SniffMimeTypeFromLocalData. | |
| 32 // | |
| 33 // Breaks |data| up into 3 substrings: URL path, MIME type hint, and content, | |
| 34 // and passes them to all three MIME type functions (Not all functions take all | |
| 35 // arguments). The first two substrings are each on their own line, and content | |
| 36 // is everything after them. Since neither URLs nor content-encoding headers can | |
| 37 // use line breaks, this doesn't reduce coverage. | |
| 38 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
| 39 base::StringPiece input(reinterpret_cast<const char*>(data), size); | |
| 40 // Mime sniffing only cares about the path of a URL, so only take the path | |
| 41 // part of the URL from the input. | |
| 42 std::string path = GetNextArgument(&input); | |
| 43 GURL url("https://unfortunate_site_that_relies_on_mime_sniffing/" + path); | |
|
mmenke
2016/03/28 20:20:59
This is a bit unfortunate - it means that a lot of
| |
| 44 | |
| 45 std::string mime_type_hint = GetNextArgument(&input); | |
| 46 | |
| 47 net::ShouldSniffMimeType(url, mime_type_hint); | |
|
eroman
2016/03/28 21:00:26
This function has a dependence on the URL scheme,
mmenke
2016/03/28 21:22:04
I've switched this to take entire URL.
I was taki
mmenke
2016/03/28 21:57:53
And just to confirm, running it now, 90%+ of the t
| |
| 48 | |
| 49 std::string result; | |
| 50 net::SniffMimeType(input.data(), input.length(), url, mime_type_hint, | |
|
eroman
2016/03/28 21:00:26
I presume it may be the case that |!url.is_valid()
mmenke
2016/03/28 21:22:04
So I don't think that case will currently be hit,
| |
| 51 &result); | |
| 52 | |
| 53 net::SniffMimeTypeFromLocalData(input.data(), input.length(), &result); | |
| 54 | |
| 55 return 0; | |
| 56 } | |
| OLD | NEW |