1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "photo_output_fuzzer.h"
17 #include "camera_device.h"
18 #include "camera_log.h"
19 #include "camera_output_capability.h"
20 #include "capture_scene_const.h"
21 #include "input/camera_manager.h"
22 #include "message_parcel.h"
23 #include <cstdint>
24 #include <memory>
25 #include "token_setproc.h"
26 #include "nativetoken_kit.h"
27 #include "accesstoken_kit.h"
28
29 namespace OHOS {
30 namespace CameraStandard {
31 namespace PhotoOutputFuzzer {
32 const int32_t LIMITSIZE = 4;
33 const int32_t NUM_TWO = 2;
34 bool g_isCameraDevicePermission = false;
35
GetPermission()36 void GetPermission()
37 {
38 uint64_t tokenId;
39 const char* perms[2];
40 perms[0] = "ohos.permission.DISTRIBUTED_DATASYNC";
41 perms[1] = "ohos.permission.CAMERA";
42 NativeTokenInfoParams infoInstance = {
43 .dcapsNum = 0,
44 .permsNum = 2,
45 .aclsNum = 0,
46 .dcaps = NULL,
47 .perms = perms,
48 .acls = NULL,
49 .processName = "native_camera_tdd",
50 .aplStr = "system_basic",
51 };
52 tokenId = GetAccessTokenId(&infoInstance);
53 SetSelfTokenID(tokenId);
54 OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
55 }
56
Test(uint8_t * rawData,size_t size)57 void Test(uint8_t *rawData, size_t size)
58 {
59 CHECK_ERROR_RETURN(rawData == nullptr || size < LIMITSIZE);
60 GetPermission();
61 auto manager = CameraManager::GetInstance();
62 CHECK_ERROR_RETURN_LOG(!manager, "PhotoOutputFuzzer: Get CameraManager instance Error");
63 auto cameras = manager->GetSupportedCameras();
64 CHECK_ERROR_RETURN_LOG(cameras.size() < NUM_TWO, "PhotoOutputFuzzer: GetSupportedCameras Error");
65 MessageParcel data;
66 data.WriteRawData(rawData, size);
67 auto camera = cameras[data.ReadUint32() % cameras.size()];
68 CHECK_ERROR_RETURN_LOG(!camera, "PhotoOutputFuzzer: camera is null");
69 int32_t mode = data.ReadInt32() % (SceneMode::APERTURE_VIDEO + NUM_TWO);
70 auto capability = manager->GetSupportedOutputCapability(camera, mode);
71 CHECK_ERROR_RETURN_LOG(!capability, "PhotoOutputFuzzer: GetSupportedOutputCapability Error");
72 auto profiles = capability->GetPhotoProfiles();
73 CHECK_ERROR_RETURN_LOG(profiles.empty(), "PhotoOutputFuzzer: GetPhotoProfiles empty");
74 Profile profile = profiles[data.ReadUint32() % profiles.size()];
75 sptr<IConsumerSurface> photoSurface = IConsumerSurface::Create();
76 CHECK_ERROR_RETURN_LOG(!photoSurface, "PhotoOutputFuzzer: create photoSurface Error");
77 sptr<IBufferProducer> producer = photoSurface->GetProducer();
78 CHECK_ERROR_RETURN_LOG(!producer, "PhotoOutputFuzzer: GetProducer Error");
79 auto output = manager->CreatePhotoOutput(profile, producer);
80 CHECK_ERROR_RETURN_LOG(!output, "PhotoOutputFuzzer: CreatePhotoOutput Error");
81 std::shared_ptr<PhotoCaptureSetting> setting = std::make_shared<PhotoCaptureSetting>();
82 sptr<HStreamCaptureCallbackImpl> callback = new (std::nothrow) HStreamCaptureCallbackImpl(output);
83 TestOutput1(output, rawData, size);
84 TestOutput2(output, rawData, size);
85 CaptureSetting(setting, rawData, size);
86 CaptureCallback(callback, rawData, size);
87 }
88
TestOutput1(sptr<PhotoOutput> output,uint8_t * rawData,size_t size)89 void TestOutput1(sptr<PhotoOutput> output, uint8_t *rawData, size_t size)
90 {
91 MEDIA_INFO_LOG("PhotoOutputFuzzer: ENTER");
92 MessageParcel data;
93 data.WriteRawData(rawData, size);
94 output->SetCallback(make_shared<PhotoStateCallbackMock>());
95 sptr<IBufferConsumerListener> listener = new IBufferConsumerListenerMock();
96 output->SetThumbnailListener(listener);
97 data.RewindRead(0);
98 output->SetThumbnail(data.ReadBool());
99 sptr<IConsumerSurface> photoSurface = IConsumerSurface::Create();
100 CHECK_ERROR_RETURN_LOG(!photoSurface, "PhotoOutputFuzzer: Create photoSurface Error");
101 sptr<IBufferProducer> producer = photoSurface->GetProducer();
102 CHECK_ERROR_RETURN_LOG(!producer, "PhotoOutputFuzzer: GetProducer Error");
103 sptr<Surface> sf = Surface::CreateSurfaceAsProducer(producer);
104 output->SetRawPhotoInfo(sf);
105 output->Capture(make_shared<PhotoCaptureSetting>());
106 output->Capture();
107 output->CancelCapture();
108 output->ConfirmCapture();
109 output->CreateStream();
110 output->GetApplicationCallback();
111 output->IsMirrorSupported();
112 output->IsQuickThumbnailSupported();
113 data.RewindRead(0);
114 int32_t type = data.ReadInt32() % (DeferredDeliveryImageType::DELIVERY_VIDEO + 1 + 1);
115 output->DeferImageDeliveryFor(static_cast<DeferredDeliveryImageType>(type));
116 output->IsDeferredImageDeliverySupported(static_cast<DeferredDeliveryImageType>(type));
117 output->IsDeferredImageDeliveryEnabled(static_cast<DeferredDeliveryImageType>(type));
118 data.RewindRead(0);
119 output->SetCallbackFlag(data.ReadUint8());
120 data.RewindRead(0);
121 output->SetNativeSurface(data.ReadBool());
122 data.RewindRead(0);
123 output->ProcessSnapshotDurationUpdates(data.ReadInt32());
124 int32_t isAutoHighQualityPhotoSupported;
125 output->IsAutoHighQualityPhotoSupported(isAutoHighQualityPhotoSupported);
126 data.RewindRead(0);
127 output->EnableAutoHighQualityPhoto(data.ReadBool());
128 output->IsEnableDeferred();
129 output->GetDefaultCaptureSetting();
130 bool isAutoAigcPhotoSupported;
131 output->IsAutoAigcPhotoSupported(isAutoAigcPhotoSupported);
132 data.RewindRead(0);
133 output->EnableAutoHighQualityPhoto(data.ReadBool());
134 output->Release();
135 }
136
TestOutput2(sptr<PhotoOutput> output,uint8_t * rawData,size_t size)137 void TestOutput2(sptr<PhotoOutput> output, uint8_t *rawData, size_t size)
138 {
139 MEDIA_INFO_LOG("PhotoOutputFuzzer: ENTER");
140 MessageParcel data;
141 data.WriteRawData(rawData, size);
142 output->SetCallback(make_shared<PhotoStateCallbackMock>());
143 data.RewindRead(0);
144 output->IsYuvOrHeifPhoto();
145 output->SetAuxiliaryPhotoHandle(data.ReadInt32());
146 output->GetAuxiliaryPhotoHandle();
147 data.RewindRead(0);
148 output->SetMovingPhotoVideoCodecType(data.ReadInt32());
149 output->IsDepthDataDeliverySupported();
150 data.RewindRead(0);
151 output->EnableMovingPhoto(data.ReadBool());
152 data.RewindRead(0);
153 output->EnableDepthDataDelivery(data.ReadBool());
154 output->CreateMultiChannel();
155 data.RewindRead(0);
156 output->AcquireBufferToPrepareProxy(data.ReadInt32());
157 data.RewindRead(0);
158 output->EnableRawDelivery(data.ReadBool());
159 data.RewindRead(0);
160 output->EnableMirror(data.ReadBool());
161 bool isEnable = static_cast<bool>(rawData);
162 output->IsRawDeliverySupported(isEnable);
163 bool isAutoCloudImageEnhancementSupported = static_cast<bool>(rawData);
164 output->IsAutoCloudImageEnhancementSupported(isAutoCloudImageEnhancementSupported);
165 bool isAutoAigcPhotoSupported = static_cast<bool>(rawData);
166 output->IsAutoAigcPhotoSupported(isAutoAigcPhotoSupported);
167 data.RewindRead(0);
168 output->EnableAutoCloudImageEnhancement(data.ReadBool());
169 data.RewindRead(0);
170 output->GetPhotoRotation(data.ReadInt32());
171 data.RewindRead(0);
172 output->EnableAutoAigcPhoto(data.ReadBool());
173 pid_t pid = *reinterpret_cast<const pid_t*>(rawData);
174 output->CameraServerDied(pid);
175 output->Release();
176 }
177
CaptureSetting(std::shared_ptr<PhotoCaptureSetting> setting,uint8_t * rawData,size_t size)178 void CaptureSetting(std::shared_ptr<PhotoCaptureSetting> setting, uint8_t *rawData, size_t size)
179 {
180 MEDIA_INFO_LOG("PhotoOutputFuzzer: ENTER");
181 MessageParcel data;
182 data.WriteRawData(rawData, size);
183 PhotoCaptureSetting::QualityLevel quality = PhotoCaptureSetting::QUALITY_LEVEL_HIGH;
184 setting->SetQuality(quality);
185 setting->GetQuality();
186 data.RewindRead(0);
187 setting->SetBurstCaptureState(data.ReadInt8());
188 PhotoCaptureSetting::RotationConfig rotationValue = PhotoCaptureSetting::RotationConfig::Rotation_0;
189 setting->SetRotation(rotationValue);
190 setting->GetRotation();
191 data.RewindRead(0);
192 setting->SetGpsLocation(data.ReadDouble(), data.ReadDouble());
193 data.RewindRead(0);
194 setting->SetMirror(data.ReadBool());
195 setting->GetMirror();
196 }
197
CaptureCallback(sptr<HStreamCaptureCallbackImpl> callback,uint8_t * rawData,size_t size)198 void CaptureCallback(sptr<HStreamCaptureCallbackImpl> callback, uint8_t *rawData, size_t size)
199 {
200 MEDIA_INFO_LOG("PhotoOutputFuzzer: ENTER");
201 MessageParcel data;
202 data.WriteRawData(rawData, size);
203 data.RewindRead(0);
204 callback->OnCaptureStarted(data.ReadInt32());
205 data.RewindRead(0);
206 callback->OnCaptureStarted(data.ReadInt32(), data.ReadInt32());
207 data.RewindRead(0);
208 callback->OnCaptureEnded(data.ReadInt32(), data.ReadInt32());
209 data.RewindRead(0);
210 callback->OnCaptureError(data.ReadInt32(), data.ReadInt32());
211 data.RewindRead(0);
212 callback->OnFrameShutter(data.ReadInt32(), data.ReadInt32());
213 data.RewindRead(0);
214 callback->OnFrameShutterEnd(data.ReadInt32(), data.ReadInt32());
215 data.RewindRead(0);
216 callback->OnCaptureReady(data.ReadInt32(), data.ReadInt32());
217 }
218
219 } // namespace StreamRepeatStubFuzzer
220 } // namespace CameraStandard
221 } // namespace OHOS
222
223 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(uint8_t * data,size_t size)224 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size)
225 {
226 /* Run your code on data */
227 OHOS::CameraStandard::PhotoOutputFuzzer::Test(data, size);
228 return 0;
229 }