blob: 365305e6ec1292739be6fcce08a7e732e06fff81 [file] [log] [blame]
/*
* Copyright (C) 2023 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 <CameraBase.h>
#include <CameraUtils.h>
#include "camera2common.h"
using namespace std;
using namespace android;
using namespace android::hardware;
constexpr int8_t kMaxLoopIterations = 20;
constexpr int32_t kSizeMin = 0;
constexpr int32_t kSizeMax = 1000;
class CameraUtilsFuzzer {
public:
void process(const uint8_t* data, size_t size);
private:
void invokeCameraUtils();
void invokeCameraBase();
FuzzedDataProvider* mFDP = nullptr;
};
void CameraUtilsFuzzer::invokeCameraUtils() {
int8_t count = kMaxLoopIterations;
while (--count > 0) {
int32_t transform = 0;
auto callCameraUtilsAPIs = mFDP->PickValueInArray<const std::function<void()>>({
[&]() {
CameraMetadata staticMetadata;
if (mFDP->ConsumeBool()) {
int32_t orientVal = mFDP->ConsumeBool()
? mFDP->PickValueInArray(kValidOrientation)
: mFDP->ConsumeIntegral<int32_t>();
uint8_t facingVal = mFDP->ConsumeBool()
? mFDP->PickValueInArray(kValidFacing)
: mFDP->ConsumeIntegral<uint8_t>();
staticMetadata.update(ANDROID_SENSOR_ORIENTATION, &orientVal, 1);
staticMetadata.update(ANDROID_LENS_FACING, &facingVal, 1);
} else {
std::vector<int32_t> orientVal;
for (int8_t i = 0;
i <= mFDP->ConsumeIntegralInRange<int32_t>(kMinCapacity, kMaxCapacity);
++i) {
orientVal.push_back(mFDP->ConsumeIntegral<int32_t>());
}
std::vector<uint8_t> facingVal = mFDP->ConsumeBytes<uint8_t>(kMaxBytes);
/**
* Resizing vector to a size between 1 to 1000 so that vector is not empty.
*/
orientVal.resize(0, mFDP->ConsumeIntegralInRange<int32_t>(kMinCapacity,
kMaxCapacity));
facingVal.resize(0, mFDP->ConsumeIntegralInRange<int32_t>(kMinCapacity,
kMaxCapacity));
staticMetadata.update(ANDROID_SENSOR_ORIENTATION, orientVal.data(),
orientVal.size());
staticMetadata.update(ANDROID_LENS_FACING, facingVal.data(),
facingVal.size());
}
CameraUtils::getRotationTransform(
staticMetadata, mFDP->ConsumeIntegral<int32_t>() /* mirrorMode */,
&transform /*out*/);
},
[&]() { CameraUtils::isCameraServiceDisabled(); },
});
callCameraUtilsAPIs();
}
}
void CameraUtilsFuzzer::invokeCameraBase() {
int8_t count = kMaxLoopIterations;
while (--count > 0) {
CameraInfo cameraInfo;
cameraInfo.facing = mFDP->ConsumeBool() ? mFDP->PickValueInArray(kValidFacing)
: mFDP->ConsumeIntegral<int>();
cameraInfo.orientation = mFDP->ConsumeBool() ? mFDP->PickValueInArray(kValidOrientation)
: mFDP->ConsumeIntegral<int>();
if (mFDP->ConsumeBool()) {
invokeReadWriteParcel<CameraInfo>(&cameraInfo);
} else {
invokeNewReadWriteParcel<CameraInfo>(&cameraInfo, *mFDP);
}
CameraStatus* cameraStatus = nullptr;
if (mFDP->ConsumeBool()) {
cameraStatus = new CameraStatus();
} else {
string id = mFDP->ConsumeRandomLengthString(kMaxBytes);
int32_t status = mFDP->ConsumeIntegral<int32_t>();
size_t unavailSubIdsSize = mFDP->ConsumeIntegralInRange<size_t>(kSizeMin, kSizeMax);
vector<string> unavailSubIds;
for (size_t idx = 0; idx < unavailSubIdsSize; ++idx) {
string unavailSubId = mFDP->ConsumeRandomLengthString(kMaxBytes);
unavailSubIds.push_back(unavailSubId);
}
string clientPackage = mFDP->ConsumeRandomLengthString(kMaxBytes);
cameraStatus = new CameraStatus(id, status, unavailSubIds, clientPackage);
}
if (mFDP->ConsumeBool()) {
invokeReadWriteParcel<CameraStatus>(cameraStatus);
} else {
invokeNewReadWriteParcel<CameraStatus>(cameraStatus, *mFDP);
}
delete cameraStatus;
}
}
void CameraUtilsFuzzer::process(const uint8_t* data, size_t size) {
mFDP = new FuzzedDataProvider(data, size);
if (mFDP->ConsumeBool()) {
invokeCameraUtils();
} else {
invokeCameraBase();
}
delete mFDP;
}
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
CameraUtilsFuzzer cameraUtilsFuzzer;
cameraUtilsFuzzer.process(data, size);
return 0;
}