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 "bgtaskgetcontinuoustaskapps_fuzzer.h"
17  #include "securec.h"
18  
19  #include "background_task_mgr_service.h"
20  #include "ibackground_task_mgr_ipc_interface_code.h"
21  
22  namespace OHOS {
23  namespace BackgroundTaskMgr {
24      const std::string BGTASK_SERVICE_NAME = "BgtaskMgrService";
25      constexpr int32_t U32_AT_SIZE = 4;
26      bool g_isOnstarted = false;
27      const std::u16string BACKGROUND_TASK_MGR_STUB_TOKEN = u"ohos.resourceschedule.IBackgroundTaskMgr";
28  
DoSomethingInterestingWithMyAPI(const char * data,size_t size)29      bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
30      {
31          MessageParcel datas;
32          datas.WriteInterfaceToken(BACKGROUND_TASK_MGR_STUB_TOKEN);
33          datas.WriteBuffer(data, size);
34          datas.RewindRead(0);
35          MessageParcel reply;
36          MessageOption option;
37          if (!g_isOnstarted) {
38              std::shared_ptr<AppExecFwk::EventRunner> runner_ {nullptr};
39              runner_ = AppExecFwk::EventRunner::Create(BGTASK_SERVICE_NAME);
40              BgContinuousTaskMgr::GetInstance()->Init(runner_);
41              g_isOnstarted = true;
42          }
43          uint32_t code = static_cast<uint32_t>(BackgroundTaskMgrStubInterfaceCode::GET_CONTINUOUS_TASK_APPS);
44          DelayedSingleton<BackgroundTaskMgrService>::GetInstance()->OnRemoteRequest(
45              code, datas, reply, option);
46          return true;
47      }
48  } // BackgroundTaskMgr
49  } // OHOS
50  
51  /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)52  extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
53  {
54      /* Run your code on data */
55      if (data == nullptr) {
56          return 0;
57      }
58  
59      if (size < OHOS::BackgroundTaskMgr::U32_AT_SIZE) {
60          return 0;
61      }
62  
63      char* ch = static_cast<char *>(malloc(size + 1));
64      if (ch == nullptr) {
65          return 0;
66      }
67  
68      (void)memset_s(ch, size + 1, 0x00, size + 1);
69      if (memcpy_s(ch, size + 1, data, size) != EOK) {
70          free(ch);
71          ch = nullptr;
72          return 0;
73      }
74  
75      OHOS::BackgroundTaskMgr::DoSomethingInterestingWithMyAPI(ch, size);
76      free(ch);
77      ch = nullptr;
78      return 0;
79  }
80