Mercurial > public > mercurial-scm > hg
annotate contrib/fuzz/fuzzutil.cc @ 40788:41f0529b5112 stable
commandserver: get around ETIMEDOUT raised by selectors2
selector.select() should exits with an empty event list on timed out, but
selectors2 raises OSError if timeout expires while recovering from EINTR.
Spotted while debugging new chg feature.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 03 Dec 2018 21:45:15 +0900 |
parents | a1c0873a9990 |
children |
rev | line source |
---|---|
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
1 #include "fuzzutil.h" |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
2 |
38232
a1c0873a9990
fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents:
38174
diff
changeset
|
3 #include <cstring> |
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
4 #include <utility> |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 |
38174
36d55f90e2a3
fuzzutil: make it possible to use absl when C++17 isn't supported
Augie Fackler <augie@google.com>
parents:
38173
diff
changeset
|
6 contrib::optional<two_inputs> SplitInputs(const uint8_t *Data, size_t Size) |
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 { |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 if (!Size) { |
38174
36d55f90e2a3
fuzzutil: make it possible to use absl when C++17 isn't supported
Augie Fackler <augie@google.com>
parents:
38173
diff
changeset
|
9 return contrib::nullopt; |
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 } |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 // figure out a random point in [0, Size] to split our input. |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
12 size_t left_size = (Data[0] / 255.0) * (Size - 1); |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
13 |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 // Copy inputs to new allocations so if bdiff over-reads |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
15 // AddressSanitizer can detect it. |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 std::unique_ptr<char[]> left(new char[left_size]); |
38232
a1c0873a9990
fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents:
38174
diff
changeset
|
17 std::memcpy(left.get(), Data + 1, left_size); |
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
18 // right starts at the next byte after left ends |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 size_t right_size = Size - (left_size + 1); |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 std::unique_ptr<char[]> right(new char[right_size]); |
38232
a1c0873a9990
fuzz: fix use of undeclared function memcpy()
Yuya Nishihara <yuya@tcha.org>
parents:
38174
diff
changeset
|
21 std::memcpy(right.get(), Data + 1 + left_size, right_size); |
38173
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
22 LOG(2) << "inputs are " << left_size << " and " << right_size |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
23 << " bytes" << std::endl; |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 two_inputs result = {std::move(right), right_size, std::move(left), |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 left_size}; |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 return result; |
fa0ddd5e8fff
fuzz: extract some common utilities and use modern C++ idioms
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 } |