/src/pistache/tests/fuzzers/fuzz_parser.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * SPDX-FileCopyrightText: 2021 David Korczynski |
3 | | * |
4 | | * SPDX-License-Identifier: Apache-2.0 |
5 | | */ |
6 | | |
7 | | #include <pistache/http.h> |
8 | | #include <pistache/router.h> |
9 | | |
10 | | using namespace Pistache; |
11 | | |
12 | | template <class F> |
13 | | void ignoreExceptions(const F& func) |
14 | 133k | { |
15 | 133k | try |
16 | 133k | { |
17 | 133k | func(); |
18 | 133k | } |
19 | 133k | catch (...) |
20 | 133k | { |
21 | 43.1k | } |
22 | 133k | } fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
fuzz_parser.cpp:void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2>(parseHttpHeader<Pistache::Http::Header::Authorization>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2 const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 4.41k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 4.69k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 4.83k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 6 | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 4.45k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 4.81k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 1.20k | } | 22 | 5.16k | } |
void ignoreExceptions<parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}>(parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1} const&) Line | Count | Source | 14 | 5.16k | { | 15 | 5.16k | try | 16 | 5.16k | { | 17 | 5.16k | func(); | 18 | 5.16k | } | 19 | 5.16k | catch (...) | 20 | 5.16k | { | 21 | 0 | } | 22 | 5.16k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 1.88k | { | 15 | 1.88k | try | 16 | 1.88k | { | 17 | 1.88k | func(); | 18 | 1.88k | } | 19 | 1.88k | catch (...) | 20 | 1.88k | { | 21 | 150 | } | 22 | 1.88k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_cookies(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 1.88k | { | 15 | 1.88k | try | 16 | 1.88k | { | 17 | 1.88k | func(); | 18 | 1.88k | } | 19 | 1.88k | catch (...) | 20 | 1.88k | { | 21 | 637 | } | 22 | 1.88k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 3.08k | { | 15 | 3.08k | try | 16 | 3.08k | { | 17 | 3.08k | func(); | 18 | 3.08k | } | 19 | 3.08k | catch (...) | 20 | 3.08k | { | 21 | 656 | } | 22 | 3.08k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_request_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 2.33k | { | 15 | 2.33k | try | 16 | 2.33k | { | 17 | 2.33k | func(); | 18 | 2.33k | } | 19 | 2.33k | catch (...) | 20 | 2.33k | { | 21 | 0 | } | 22 | 2.33k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 352 | { | 15 | 352 | try | 16 | 352 | { | 17 | 352 | func(); | 18 | 352 | } | 19 | 352 | catch (...) | 20 | 352 | { | 21 | 189 | } | 22 | 352 | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_response_parser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 162 | { | 15 | 162 | try | 16 | 162 | { | 17 | 162 | func(); | 18 | 162 | } | 19 | 162 | catch (...) | 20 | 162 | { | 21 | 0 | } | 22 | 162 | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_0 const&) Line | Count | Source | 14 | 35.9k | { | 15 | 35.9k | try | 16 | 35.9k | { | 17 | 35.9k | func(); | 18 | 35.9k | } | 19 | 35.9k | catch (...) | 20 | 35.9k | { | 21 | 13.1k | } | 22 | 35.9k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_1 const&) Line | Count | Source | 14 | 10.8k | { | 15 | 10.8k | try | 16 | 10.8k | { | 17 | 10.8k | func(); | 18 | 10.8k | } | 19 | 10.8k | catch (...) | 20 | 10.8k | { | 21 | 3.99k | } | 22 | 10.8k | } |
fuzz_parser.cpp:void ignoreExceptions<fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2>(fuzz_router(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_2 const&) Line | Count | Source | 14 | 4.86k | { | 15 | 4.86k | try | 16 | 4.86k | { | 17 | 4.86k | func(); | 18 | 4.86k | } | 19 | 4.86k | catch (...) | 20 | 4.86k | { | 21 | 0 | } | 22 | 4.86k | } |
|
23 | | |
24 | | template <class T> |
25 | | void parseHttpHeader(const std::string& input) |
26 | 56.7k | { |
27 | 56.7k | T header; |
28 | 56.7k | ignoreExceptions([&] { header.parse(input); }); parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda()#1}::operator()() const Line | Count | Source | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
|
29 | | |
30 | 56.7k | std::stringstream oss; |
31 | 56.7k | header.write(oss); |
32 | 56.7k | } void parseHttpHeader<Pistache::Http::Header::Accept>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::CacheControl>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::Connection>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::ContentEncoding>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::ContentLength>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::ContentType>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::Date>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::Expect>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::Host>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
void parseHttpHeader<Pistache::Http::Header::Server>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 26 | 5.16k | { | 27 | 5.16k | T header; | 28 | 5.16k | ignoreExceptions([&] { header.parse(input); }); | 29 | | | 30 | 5.16k | std::stringstream oss; | 31 | 5.16k | header.write(oss); | 32 | 5.16k | } |
|
33 | | |
34 | | template <> |
35 | | void parseHttpHeader<Pistache::Http::Header::Authorization>(const std::string& input) |
36 | 5.16k | { |
37 | 5.16k | Pistache::Http::Header::Authorization header; |
38 | 5.16k | ignoreExceptions([&] { header.parse(input); }); |
39 | 5.16k | ignoreExceptions([&] { header.getMethod(); }); |
40 | 5.16k | ignoreExceptions( |
41 | 5.16k | [&] { |
42 | 5.16k | const auto user = header.getBasicUser(); |
43 | 5.16k | const auto password = header.getBasicPassword(); |
44 | 5.16k | header.setBasicUserPassword(user, password); |
45 | 5.16k | }); |
46 | | |
47 | 5.16k | std::stringstream oss; |
48 | 5.16k | header.write(oss); |
49 | 5.16k | } |
50 | | |
51 | | void fuzz_headers(const std::string& input) |
52 | 5.16k | { |
53 | 5.16k | parseHttpHeader<Pistache::Http::Header::Accept>(input); |
54 | 5.16k | parseHttpHeader<Pistache::Http::Header::CacheControl>(input); |
55 | 5.16k | parseHttpHeader<Pistache::Http::Header::Connection>(input); |
56 | 5.16k | parseHttpHeader<Pistache::Http::Header::AcceptEncoding>(input); |
57 | 5.16k | parseHttpHeader<Pistache::Http::Header::ContentEncoding>(input); |
58 | 5.16k | parseHttpHeader<Pistache::Http::Header::ContentLength>(input); |
59 | 5.16k | parseHttpHeader<Pistache::Http::Header::ContentType>(input); |
60 | 5.16k | parseHttpHeader<Pistache::Http::Header::Authorization>(input); |
61 | 5.16k | parseHttpHeader<Pistache::Http::Header::Date>(input); |
62 | 5.16k | parseHttpHeader<Pistache::Http::Header::Expect>(input); |
63 | 5.16k | parseHttpHeader<Pistache::Http::Header::Host>(input); |
64 | 5.16k | parseHttpHeader<Pistache::Http::Header::Server>(input); |
65 | 5.16k | } |
66 | | |
67 | | void fuzz_cookies(const std::string& input) |
68 | 1.88k | { |
69 | 1.88k | Pistache::Http::CookieJar cookie_jar; |
70 | 1.88k | ignoreExceptions([&] { Pistache::Http::Cookie::fromString(input); }); |
71 | 1.88k | ignoreExceptions([&] { cookie_jar.addFromRaw(input.data(), input.size()); }); |
72 | 1.88k | } |
73 | | |
74 | | void fuzz_request_parser(const std::string& input) |
75 | 3.09k | { |
76 | 3.09k | constexpr size_t maxDataSize = 4096; |
77 | 3.09k | Pistache::Http::RequestParser rparser(maxDataSize); |
78 | | |
79 | 3.09k | if (rparser.feed(input.data(), input.size())) |
80 | 3.08k | { |
81 | 3.08k | auto state = Pistache::Http::Private::State::Done; |
82 | 3.08k | ignoreExceptions([&] { state = rparser.parse(); }); |
83 | | |
84 | 3.08k | if (state == Pistache::Http::Private::State::Again) |
85 | 2.33k | ignoreExceptions([&] { rparser.parse(); }); |
86 | 3.08k | } |
87 | 3.09k | } |
88 | | |
89 | | void fuzz_response_parser(const std::string& input) |
90 | 359 | { |
91 | 359 | constexpr size_t maxDataSize = 4096; |
92 | 359 | Pistache::Http::ResponseParser rparser(maxDataSize); |
93 | | |
94 | 359 | if (rparser.feed(input.data(), input.size())) |
95 | 352 | { |
96 | 352 | auto state = Pistache::Http::Private::State::Done; |
97 | 352 | ignoreExceptions([&] { state = rparser.parse(); }); |
98 | | |
99 | 352 | if (state == Pistache::Http::Private::State::Again) |
100 | 162 | ignoreExceptions([&] { rparser.parse(); }); |
101 | 352 | } |
102 | 359 | } |
103 | | |
104 | | void fuzz_router(const std::string& input) |
105 | 2.52k | { |
106 | 2.52k | std::string path_input; |
107 | 2.52k | std::stringstream input_stream(input); |
108 | 2.52k | Pistache::Rest::SegmentTreeNode tree; |
109 | | |
110 | 66.1k | while (std::getline(input_stream, path_input, '\n')) |
111 | 63.6k | { |
112 | 63.6k | if (path_input.size() < 2) |
113 | 4.76k | continue; |
114 | | |
115 | 58.8k | const int test_case = path_input.back(); |
116 | 58.8k | path_input.pop_back(); |
117 | | |
118 | 58.8k | const auto sanitized = Pistache::Rest::SegmentTreeNode::sanitizeResource(path_input); |
119 | 58.8k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
120 | 58.8k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
121 | 58.8k | const std::string_view path { ptr.get(), sanitized.length() }; |
122 | | |
123 | 58.8k | switch (test_case) |
124 | 58.8k | { |
125 | 35.9k | case 'A': |
126 | 35.9k | ignoreExceptions([&] { |
127 | 35.9k | Pistache::Rest::Route::Handler handler = [](auto...) { return Pistache::Rest::Route::Result::Ok; }; |
128 | 35.9k | std::shared_ptr<char> ptr(new char[sanitized.length()], std::default_delete<char[]>()); |
129 | 35.9k | std::memcpy(ptr.get(), sanitized.data(), sanitized.length()); |
130 | 35.9k | const std::string_view path { ptr.get(), sanitized.length() }; |
131 | 35.9k | tree.addRoute(path, handler, ptr); |
132 | 35.9k | }); |
133 | 35.9k | break; |
134 | 10.8k | case 'R': |
135 | 10.8k | ignoreExceptions([&] { tree.removeRoute(path); }); |
136 | 10.8k | break; |
137 | 4.86k | case 'F': |
138 | 4.86k | ignoreExceptions([&] { tree.findRoute(path); }); |
139 | 4.86k | break; |
140 | 58.8k | } |
141 | 58.8k | } |
142 | 2.52k | } |
143 | | |
144 | | void fuzz_other(const std::string& input) |
145 | 25 | { |
146 | | // URI parsing |
147 | 25 | Http::Uri::Query query1; |
148 | 25 | query1.add(input, input); |
149 | 25 | } |
150 | | |
151 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
152 | 13.0k | { |
153 | 13.0k | if (size < 1) |
154 | 0 | return -1; |
155 | | |
156 | 13.0k | const uint8_t type = data[0]; |
157 | 13.0k | const std::string input(reinterpret_cast<const char*>(data + 1), size - 1); |
158 | | |
159 | 13.0k | switch (type) |
160 | 13.0k | { |
161 | 5.16k | case 'H': |
162 | 5.16k | fuzz_headers(input); |
163 | 5.16k | break; |
164 | 1.88k | case 'C': |
165 | 1.88k | fuzz_cookies(input); |
166 | 1.88k | break; |
167 | 3.09k | case 'R': |
168 | 3.09k | fuzz_request_parser(input); |
169 | 3.09k | break; |
170 | 359 | case 'A': |
171 | 359 | fuzz_response_parser(input); |
172 | 359 | break; |
173 | 2.52k | case 'S': |
174 | 2.52k | fuzz_router(input); |
175 | 2.52k | break; |
176 | 25 | case 'O': |
177 | 25 | fuzz_other(input); |
178 | 25 | break; |
179 | 13.0k | } |
180 | | |
181 | 13.0k | return 0; |
182 | 13.0k | } |