/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include "camera2common.h" using namespace std; using namespace android; using namespace android::hardware::camera2::params; constexpr int32_t kSizeMin = 0; constexpr int32_t kSizeMax = 1000; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { FuzzedDataProvider fdp = FuzzedDataProvider(data, size); OutputConfiguration* outputConfiguration = nullptr; if (fdp.ConsumeBool()) { outputConfiguration = new OutputConfiguration(); } else { int32_t rotation = fdp.ConsumeIntegral(); string phyCameraId = fdp.ConsumeRandomLengthString(); String16 physicalCameraId(phyCameraId.c_str()); int32_t surfaceSetID = fdp.ConsumeIntegral(); bool isShared = fdp.ConsumeBool(); if (fdp.ConsumeBool()) { sp iGBP = nullptr; sp composerClient = new SurfaceComposerClient; sp surfaceControl = composerClient->createSurface( static_cast(fdp.ConsumeRandomLengthString().c_str()) /* name */, fdp.ConsumeIntegral() /* width */, fdp.ConsumeIntegral() /* height */, fdp.ConsumeIntegral() /* format */, fdp.ConsumeIntegral() /* flags */); if (surfaceControl) { sp surface = surfaceControl->getSurface(); iGBP = surface->getIGraphicBufferProducer(); } outputConfiguration = new OutputConfiguration(iGBP, rotation, physicalCameraId, surfaceSetID, isShared); iGBP.clear(); composerClient.clear(); surfaceControl.clear(); } else { size_t iGBPSize = fdp.ConsumeIntegralInRange(kSizeMin, kSizeMax); vector> iGBPs; for (size_t idx = 0; idx < iGBPSize; ++idx) { sp iGBP = nullptr; sp composerClient = new SurfaceComposerClient; sp surfaceControl = composerClient->createSurface( static_cast(fdp.ConsumeRandomLengthString().c_str()) /* name */, fdp.ConsumeIntegral() /* width */, fdp.ConsumeIntegral() /* height */, fdp.ConsumeIntegral() /* format */, fdp.ConsumeIntegral() /* flags */); if (surfaceControl) { sp surface = surfaceControl->getSurface(); iGBP = surface->getIGraphicBufferProducer(); iGBPs.push_back(iGBP); } iGBP.clear(); composerClient.clear(); surfaceControl.clear(); } outputConfiguration = new OutputConfiguration(iGBPs, rotation, physicalCameraId, surfaceSetID, isShared); } } outputConfiguration->getRotation(); outputConfiguration->getSurfaceSetID(); outputConfiguration->getSurfaceType(); outputConfiguration->getWidth(); outputConfiguration->getHeight(); outputConfiguration->isDeferred(); outputConfiguration->isShared(); outputConfiguration->getPhysicalCameraId(); OutputConfiguration outputConfiguration2; outputConfiguration->gbpsEqual(outputConfiguration2); outputConfiguration->sensorPixelModesUsedEqual(outputConfiguration2); outputConfiguration->gbpsLessThan(outputConfiguration2); outputConfiguration->sensorPixelModesUsedLessThan(outputConfiguration2); outputConfiguration->getGraphicBufferProducers(); sp gbp; outputConfiguration->addGraphicProducer(gbp); invokeReadWriteNullParcel(outputConfiguration); invokeReadWriteParcel(outputConfiguration); delete outputConfiguration; return 0; }