• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }