diff options
| author | 2023-06-30 04:16:31 +0000 | |
|---|---|---|
| committer | 2023-06-30 04:16:31 +0000 | |
| commit | 1f7191d04533c1de51029d282d00562f80d1c90c (patch) | |
| tree | 271634292d0f9576b66bee0dab91e2c90ed40924 | |
| parent | 6e78dab5fb3dab45db7d77aa8d1c37f0f23b0df6 (diff) | |
| parent | 61ff027d2a7221b81c02552b57f4fd7e2fbf93c5 (diff) | |
Merge "Revert "Delete fds and binders in fuzzService"" am: cc95c107be am: 1d568e3d6c am: 61ff027d2a
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2645986
Change-Id: Iaf536d8581f655c1bda9b0ce8593b9ab318cd2a2
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp | 97 |
1 files changed, 35 insertions, 62 deletions
diff --git a/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp b/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp index 24a9345193..9078676031 100644 --- a/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp +++ b/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp @@ -43,72 +43,45 @@ void fuzzService(const std::vector<sp<IBinder>>& binders, FuzzedDataProvider&& p } while (provider.remaining_bytes() > 0) { - provider.PickValueInArray<std::function<void()>>({ - [&]() { - // Most of the AIDL services will have small set of transaction codes. - uint32_t code = provider.ConsumeBool() - ? provider.ConsumeIntegral<uint32_t>() - : provider.ConsumeIntegralInRange<uint32_t>(0, 100); - uint32_t flags = provider.ConsumeIntegral<uint32_t>(); - Parcel data; - // for increased fuzz coverage - data.setEnforceNoDataAvail(false); - data.setServiceFuzzing(); + // Most of the AIDL services will have small set of transaction codes. + uint32_t code = provider.ConsumeBool() ? provider.ConsumeIntegral<uint32_t>() + : provider.ConsumeIntegralInRange<uint32_t>(0, 100); + uint32_t flags = provider.ConsumeIntegral<uint32_t>(); + Parcel data; + // for increased fuzz coverage + data.setEnforceNoDataAvail(false); + data.setServiceFuzzing(); - sp<IBinder> target = options.extraBinders.at( - provider.ConsumeIntegralInRange<size_t>(0, - options.extraBinders.size() - - 1)); - options.writeHeader = [&target](Parcel* p, FuzzedDataProvider& provider) { - // most code will be behind checks that the head of the Parcel - // is exactly this, so make it easier for fuzzers to reach this - if (provider.ConsumeBool()) { - p->writeInterfaceToken(target->getInterfaceDescriptor()); - } - }; + sp<IBinder> target = options.extraBinders.at( + provider.ConsumeIntegralInRange<size_t>(0, options.extraBinders.size() - 1)); + options.writeHeader = [&target](Parcel* p, FuzzedDataProvider& provider) { + // most code will be behind checks that the head of the Parcel + // is exactly this, so make it easier for fuzzers to reach this + if (provider.ConsumeBool()) { + p->writeInterfaceToken(target->getInterfaceDescriptor()); + } + }; - std::vector<uint8_t> subData = provider.ConsumeBytes<uint8_t>( - provider.ConsumeIntegralInRange<size_t>(0, provider.remaining_bytes())); - fillRandomParcel(&data, FuzzedDataProvider(subData.data(), subData.size()), - &options); + std::vector<uint8_t> subData = provider.ConsumeBytes<uint8_t>( + provider.ConsumeIntegralInRange<size_t>(0, provider.remaining_bytes())); + fillRandomParcel(&data, FuzzedDataProvider(subData.data(), subData.size()), &options); - Parcel reply; - // for increased fuzz coverage - reply.setEnforceNoDataAvail(false); - reply.setServiceFuzzing(); - (void)target->transact(code, data, &reply, flags); + Parcel reply; + // for increased fuzz coverage + reply.setEnforceNoDataAvail(false); + reply.setServiceFuzzing(); + (void)target->transact(code, data, &reply, flags); - // feed back in binders and fds that are returned from the service, so that - // we can fuzz those binders, and use the fds and binders to feed back into - // the binders - auto retBinders = reply.debugReadAllStrongBinders(); - options.extraBinders.insert(options.extraBinders.end(), retBinders.begin(), - retBinders.end()); - auto retFds = reply.debugReadAllFileDescriptors(); - for (size_t i = 0; i < retFds.size(); i++) { - options.extraFds.push_back(base::unique_fd(dup(retFds[i]))); - } - }, - [&]() { - if (options.extraFds.size() == 0) { - return; - } - uint32_t toDelete = - provider.ConsumeIntegralInRange<uint32_t>(0, - options.extraFds.size() - 1); - options.extraFds.erase(options.extraFds.begin() + toDelete); - }, - [&]() { - if (options.extraBinders.size() <= 1) { - return; - } - uint32_t toDelete = - provider.ConsumeIntegralInRange<uint32_t>(0, - options.extraBinders.size() - - 1); - options.extraBinders.erase(options.extraBinders.begin() + toDelete); - }, - })(); + // feed back in binders and fds that are returned from the service, so that + // we can fuzz those binders, and use the fds and binders to feed back into + // the binders + auto retBinders = reply.debugReadAllStrongBinders(); + options.extraBinders.insert(options.extraBinders.end(), retBinders.begin(), + retBinders.end()); + auto retFds = reply.debugReadAllFileDescriptors(); + for (size_t i = 0; i < retFds.size(); i++) { + options.extraFds.push_back(base::unique_fd(dup(retFds[i]))); + } } // invariants |