• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "media_manager_fuzzer.h"
17 #include "message_parcel.h"
18 #include "securec.h"
19 #include "camera_log.h"
20 
21 namespace OHOS {
22 namespace CameraStandard {
23 using namespace DeferredProcessing;
24 static constexpr int32_t MAX_CODE_LEN  = 512;
25 static constexpr int32_t MIN_SIZE_NUM = 4;
26 static const uint8_t* RAW_DATA = nullptr;
27 const size_t THRESHOLD = 10;
28 static size_t g_dataSize = 0;
29 static size_t g_pos;
30 std::shared_ptr<MediaManager> MediaManagerFuzzer::fuzz_{nullptr};
31 
32 /*
33 * describe: get data from outside untrusted data(g_data) which size is according to sizeof(T)
34 * tips: only support basic type
35 */
36 template<class T>
GetData()37 T GetData()
38 {
39     T object {};
40     size_t objectSize = sizeof(object);
41     if (RAW_DATA == nullptr || objectSize > g_dataSize - g_pos) {
42         return object;
43     }
44     errno_t ret = memcpy_s(&object, objectSize, RAW_DATA + g_pos, objectSize);
45     if (ret != EOK) {
46         return {};
47     }
48     g_pos += objectSize;
49     return object;
50 }
51 
52 template<class T>
GetArrLength(T & arr)53 uint32_t GetArrLength(T& arr)
54 {
55     if (arr == nullptr) {
56         MEDIA_INFO_LOG("%{public}s: The array length is equal to 0", __func__);
57         return 0;
58     }
59     return sizeof(arr) / sizeof(arr[0]);
60 }
61 
MediaManagerFuzzTest()62 void MediaManagerFuzzer::MediaManagerFuzzTest()
63 {
64     if ((RAW_DATA == nullptr) || (g_dataSize > MAX_CODE_LEN) || (g_dataSize < MIN_SIZE_NUM)) {
65         return;
66     }
67     fuzz_ = std::make_shared<MediaManager>();
68     CHECK_ERROR_RETURN_LOG(!fuzz_, "Create fuzz_ Error");
69     auto inFd = GetData<int32_t>();
70     auto outFd = GetData<int32_t>();
71     auto tempFd = GetData<int32_t>();
72     fuzz_->Create(inFd, outFd, tempFd);
73     fuzz_->Pause();
74     fuzz_->Stop();
75     std::vector<uint8_t> memoryFlags = {
76         static_cast<uint8_t>(MemoryFlag::MEMORY_READ_ONLY),
77         static_cast<uint8_t>(MemoryFlag::MEMORY_WRITE_ONLY),
78         static_cast<uint8_t>(MemoryFlag::MEMORY_READ_WRITE)
79     };
80     std::vector<Media::Plugins::MediaType> mediaTypes = {
81         Media::Plugins::MediaType::UNKNOWN,
82         Media::Plugins::MediaType::AUDIO,
83         Media::Plugins::MediaType::VIDEO,
84         Media::Plugins::MediaType::SUBTITLE,
85         Media::Plugins::MediaType::ATTACHMENT,
86         Media::Plugins::MediaType::DATA,
87         Media::Plugins::MediaType::TIMEDMETA
88     };
89     uint8_t randomIndex = GetData<uint8_t>() % memoryFlags.size();
90     MemoryFlag selectedFlag = static_cast<MemoryFlag>(memoryFlags[randomIndex]);
91     uint8_t mediaTypeIndex = GetData<uint8_t>() % mediaTypes.size();
92     Media::Plugins::MediaType selectedMediaType = mediaTypes[mediaTypeIndex];
93     std::shared_ptr<AVAllocator> avAllocator =
94         AVAllocatorFactory::CreateSharedAllocator(selectedFlag);
95     int32_t capacity = GetData<int32_t>();
96     std::shared_ptr<AVBuffer> buffer = AVBuffer::CreateAVBuffer(avAllocator, capacity);
97     fuzz_->WriteSample(selectedMediaType, buffer);
98     fuzz_->ReadSample(selectedMediaType, buffer);
99     auto size_ = GetData<int64_t>();
100     fuzz_->Recover(size_);
101     fuzz_->CopyAudioTrack();
102     fuzz_->InitReader();
103     fuzz_->InitWriter();
104     auto duration = GetData<int64_t>();
105     auto bitRate = GetData<int64_t>();
106     fuzz_->InitRecoverReader(size_, duration, bitRate);
107     fuzz_->GetRecoverInfo(size_);
108 }
109 
ReaderFuzzTest()110 void MediaManagerFuzzer::ReaderFuzzTest()
111 {
112     std::shared_ptr<Reader> inputReader {nullptr};
113     inputReader = std::make_shared<Reader>();
114     CHECK_ERROR_RETURN_LOG(!inputReader, "Create inputReader Error");
115     inputReader->GetSourceFormat();
116 }
117 
TrackFuzzTest()118 void MediaManagerFuzzer::TrackFuzzTest()
119 {
120     std::shared_ptr<Track> track {nullptr};
121     track = std::make_shared<Track>();
122     CHECK_ERROR_RETURN_LOG(!track, "Create track Error");
123     TrackFormat formatOfIndex;
124     Format trackFormat;
125     int32_t trackType = GetData<int32_t>();
126     int32_t trackIndex = GetData<int32_t>();
127 
128     std::vector<Media::Plugins::MediaType> mediaTypes = {
129         Media::Plugins::MediaType::UNKNOWN,
130         Media::Plugins::MediaType::AUDIO,
131         Media::Plugins::MediaType::VIDEO,
132         Media::Plugins::MediaType::SUBTITLE,
133         Media::Plugins::MediaType::ATTACHMENT,
134         Media::Plugins::MediaType::DATA,
135         Media::Plugins::MediaType::TIMEDMETA
136     };
137     uint8_t mediaTypeIndex = GetData<uint8_t>() % mediaTypes.size();
138     Media::Plugins::MediaType selectedMediaType = mediaTypes[mediaTypeIndex];
139 
140     trackFormat.GetIntValue(Media::Tag::MEDIA_TYPE, trackType);
141     formatOfIndex.format = std::make_shared<Format>(trackFormat);
142     formatOfIndex.trackId = trackIndex;
143     track->SetFormat(formatOfIndex, selectedMediaType);
144     track->GetFormat();
145 }
146 
WriterFuzzTest()147 void MediaManagerFuzzer::WriterFuzzTest()
148 {
149     std::shared_ptr<Writer> writer {nullptr};
150     writer = std::make_shared<Writer>();
151     CHECK_ERROR_RETURN_LOG(!writer, "Create writer Error");
152     auto outputFd = GetData<int32_t>();
153     std::shared_ptr<AVSourceFuzz> source = std::make_shared<AVSourceFuzz>();
154     std::map<Media::Plugins::MediaType, std::shared_ptr<Track>> tracks;
155     writer->Create(outputFd, tracks);
156 
157     std::vector<uint8_t> memoryFlags = {
158         static_cast<uint8_t>(MemoryFlag::MEMORY_READ_ONLY),
159         static_cast<uint8_t>(MemoryFlag::MEMORY_WRITE_ONLY),
160         static_cast<uint8_t>(MemoryFlag::MEMORY_READ_WRITE)
161     };
162     uint8_t randomIndex = GetData<uint8_t>() % memoryFlags.size();
163     MemoryFlag selectedFlag = static_cast<MemoryFlag>(memoryFlags[randomIndex]);
164 
165     std::shared_ptr<AVAllocator> avAllocator =
166         AVAllocatorFactory::CreateSharedAllocator(selectedFlag);
167     int32_t capacity = GetData<int32_t>();
168     std::shared_ptr<AVBuffer> sample = AVBuffer::CreateAVBuffer(avAllocator, capacity);
169     writer->Start();
170 }
171 
MuxerFuzzTest()172 void MediaManagerFuzzer::MuxerFuzzTest()
173 {
174     std::shared_ptr<Muxer> muxer {nullptr};
175     muxer = std::make_shared<Muxer>();
176     CHECK_ERROR_RETURN_LOG(!muxer, "Create muxer Error");
177     auto outputFd = GetData<int32_t>();
178     std::vector<Plugins::OutputFormat> outputFormats = {
179         Plugins::OutputFormat::DEFAULT,
180         Plugins::OutputFormat::MPEG_4,
181         Plugins::OutputFormat::M4A,
182         Plugins::OutputFormat::AMR,
183         Plugins::OutputFormat::MP3,
184         Plugins::OutputFormat::WAV
185     };
186     uint8_t outputFormatIndex = GetData<uint8_t>() % outputFormats.size();
187     Plugins::OutputFormat selectedOutputFormat = outputFormats[outputFormatIndex];
188     muxer->Create(outputFd, selectedOutputFormat);
189     std::map<Media::Plugins::MediaType, std::shared_ptr<Track>> tracks;
190     muxer->AddTracks(tracks);
191 }
192 
Test()193 void Test()
194 {
195     auto mediaManager = std::make_unique<MediaManagerFuzzer>();
196     if (mediaManager == nullptr) {
197         MEDIA_INFO_LOG("mediaManager is null");
198         return;
199     }
200     mediaManager->MediaManagerFuzzTest();
201     mediaManager->WriterFuzzTest();
202     mediaManager->TrackFuzzTest();
203     mediaManager->ReaderFuzzTest();
204     mediaManager->MuxerFuzzTest();
205 }
206 
207 typedef void (*TestFuncs[1])();
208 
209 TestFuncs g_testFuncs = {
210     Test,
211 };
212 
FuzzTest(const uint8_t * rawData,size_t size)213 bool FuzzTest(const uint8_t* rawData, size_t size)
214 {
215     // initialize data
216     RAW_DATA = rawData;
217     g_dataSize = size;
218     g_pos = 0;
219 
220     uint32_t code = GetData<uint32_t>();
221     uint32_t len = GetArrLength(g_testFuncs);
222     if (len > 0) {
223         g_testFuncs[code % len]();
224     } else {
225         MEDIA_INFO_LOG("%{public}s: The len length is equal to 0", __func__);
226     }
227 
228     return true;
229 }
230 } // namespace CameraStandard
231 } // namespace OHOS
232 
233 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(uint8_t * data,size_t size)234 extern "C" int LLVMFuzzerTestOneInput(uint8_t* data, size_t size)
235 {
236     if (size < OHOS::CameraStandard::THRESHOLD) {
237         return 0;
238     }
239 
240     OHOS::CameraStandard::FuzzTest(data, size);
241     return 0;
242 }