Skip to content

Commit b9067b8

Browse files
devinmoore-googAndroid (Google) Code Review
authored andcommitted
Merge changes I01f5f1d5,I65aa5ebd,I67746d7f into main
* changes: binder_parcel_fuzzer: close FDs in unflatten Check for leaking FDs in binder_parcel_fuzzer Add errno to CHECK_EQ log
2 parents e789c58 + 01c9cdc commit b9067b8

3 files changed

Lines changed: 20 additions & 4 deletions

File tree

libs/binder/tests/parcel_fuzzer/binder.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,17 @@ struct ExampleFlattenable : public android::Flattenable<ExampleFlattenable> {
6262
FUZZ_LOG() << "should not reach";
6363
abort();
6464
}
65-
status_t unflatten(void const*& buffer, size_t& size, int const*& /*fds*/, size_t& /*count*/) {
65+
status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count) {
66+
for (size_t i = 0; i < count; i++) {
67+
close(fds[i]);
68+
}
6669
if (size < sizeof(mValue)) {
6770
return android::NO_MEMORY;
6871
}
6972
android::FlattenableUtils::read(buffer, size, mValue);
7073
return android::OK;
7174
}
75+
7276
private:
7377
int32_t mValue = 0xFEEDBEEF;
7478
};

libs/binder/tests/parcel_fuzzer/main.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@
2828
#include <fuzzbinder/random_parcel.h>
2929
#include <fuzzer/FuzzedDataProvider.h>
3030

31-
#include <cstdlib>
32-
#include <ctime>
3331
#include <sys/resource.h>
3432
#include <sys/time.h>
33+
#include <cstdlib>
34+
#include <ctime>
35+
#include <filesystem>
3536

3637
#include "../../Utils.h"
3738

@@ -157,12 +158,21 @@ static AIBinder_Class* kNothingClass =
157158
AIBinder_Class_define("nothing", NothingClass_onCreate, NothingClass_onDestroy,
158159
NothingClass_onTransact);
159160

161+
static long numFds() {
162+
return std::distance(std::filesystem::directory_iterator("/proc/self/fd"),
163+
std::filesystem::directory_iterator{});
164+
}
160165
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
161166
if (size <= 1) return 0; // no use
162167

163168
// avoid timeouts, see b/142617274, b/142473153
164169
if (size > 50000) return 0;
165170

171+
struct rlimit limit{};
172+
CHECK_EQ(0, getrlimit(RLIMIT_NOFILE, &limit));
173+
uint64_t maxFds = limit.rlim_cur;
174+
int initialFds = numFds();
175+
166176
FuzzedDataProvider provider = FuzzedDataProvider(data, size);
167177

168178
const std::function<void(FuzzedDataProvider&&)> fuzzBackend[] = {
@@ -209,5 +219,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
209219

210220
provider.PickValueInArray(fuzzBackend)(std::move(provider));
211221

222+
CHECK_EQ(initialFds, numFds()) << "FDs are being leaked";
212223
return 0;
213224
}

libs/binder/tests/parcel_fuzzer/random_fd.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ std::vector<unique_fd> getRandomFds(FuzzedDataProvider* provider) {
5555
// TODO(b/236812909): also test blocking
5656
if (true) flags |= O_NONBLOCK;
5757

58-
CHECK_EQ(0, pipe2(pipefds, flags)) << flags;
58+
CHECK_EQ(0, pipe2(pipefds, flags))
59+
<< "flags: " << flags << ", errno: " << strerror(errno);
5960

6061
if (provider->ConsumeBool()) std::swap(pipefds[0], pipefds[1]);
6162

0 commit comments

Comments
 (0)