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 #include "cloudsyncservicestub_fuzzer.h" 16 17 #include <cstddef> 18 #include <cstdint> 19 #include <fcntl.h> 20 #include <map> 21 22 #include "accesstoken_kit.h" 23 #include "cloud_file_sync_service_interface_code.h" 24 #include "cloud_fuzzer_helper.h" 25 #include "cloud_sync_service.h" 26 #include "cloud_sync_service_stub.h" 27 #include "i_cloud_download_callback.h" 28 #include "i_cloud_sync_callback.h" 29 #include "i_download_asset_callback.h" 30 #include "task_state_manager.h" 31 32 #include "message_parcel.h" 33 #include "nativetoken_kit.h" 34 #include "token_setproc.h" 35 #include "utils_log.h" 36 37 namespace OHOS { 38 constexpr size_t U32_AT_SIZE = 4; 39 constexpr size_t U64_AT_SIZE = 8; 40 constexpr size_t BOOL_AT_SIZE = 1; 41 constexpr int SPLITE_SIZE = 5; 42 const std::u16string CLOUD_SYNC_SERVICE_TOKEN = u"OHOS.Filemanagement.Dfs.ICloudSyncService"; 43 constexpr int32_t SERVICE_SA_ID = 5204; 44 45 using namespace OHOS::FileManagement::CloudSync; 46 using namespace std; 47 class ICloudSyncCallbackTest : public IRemoteStub<ICloudSyncCallback> { 48 public: OnSyncStateChanged(SyncType type,SyncPromptState state)49 void OnSyncStateChanged(SyncType type, SyncPromptState state) override {} OnSyncStateChanged(CloudSyncState state,ErrorType error)50 void OnSyncStateChanged(CloudSyncState state, ErrorType error) override {} 51 }; 52 53 class ICloudDownloadCallbackTest : public IRemoteStub<ICloudDownloadCallback> { 54 public: OnDownloadProcess(const DownloadProgressObj & progress)55 void OnDownloadProcess(const DownloadProgressObj &progress) override {} 56 }; 57 58 class IDownloadAssetCallbackTest : public IRemoteStub<IDownloadAssetCallback> { 59 public: OnFinished(const TaskId taskId,const std::string & uri,const int32_t result)60 void OnFinished(const TaskId taskId, const std::string &uri, const int32_t result) override {} 61 }; 62 NativeTokenGet(bool isSystem)63 void NativeTokenGet(bool isSystem) 64 { 65 uint64_t tokenId; 66 static const char *perms[] = {"ohos.permission.CLOUDFILE_SYNC", "ohos.permission.CLOUDFILE_SYNC_MANAGER", 67 "ohos.permission.PROXY_AUTHORIZATION_URI"}; 68 NativeTokenInfoParams infoInstance = { 69 .dcapsNum = 0, 70 .permsNum = 3, 71 .aclsNum = 0, 72 .dcaps = nullptr, 73 .perms = perms, 74 .acls = nullptr, 75 .aplStr = "system_core", 76 }; 77 78 infoInstance.processName = "CloudOnRemoteRequestFuzzerTest"; 79 tokenId = GetAccessTokenId(&infoInstance); 80 if (isSystem) { 81 const uint64_t systemAppMask = (static_cast<uint64_t>(1) << 32); 82 tokenId |= systemAppMask; 83 } 84 SetSelfTokenID(tokenId); 85 OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo(); 86 } 87 WriteInterfaceToken(MessageParcel & data)88 bool WriteInterfaceToken(MessageParcel &data) 89 { 90 if (!data.WriteInterfaceToken(CLOUD_SYNC_SERVICE_TOKEN)) { 91 LOGE("Write token failed."); 92 return false; 93 } 94 return true; 95 } 96 HandleChangeAppSwitchFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)97 void HandleChangeAppSwitchFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 98 FuzzData &fuzzData, 99 size_t size) 100 { 101 fuzzData.ResetData(size); 102 MessageParcel datas; 103 if (!WriteInterfaceToken(datas)) { 104 return; 105 } 106 bool status = fuzzData.GetData<bool>(); 107 int pos = static_cast<int>((size - BOOL_AT_SIZE) >> 1); 108 std::string accountId = fuzzData.GetStringFromData(pos); 109 std::string bundleName = fuzzData.GetStringFromData(pos); 110 datas.WriteString(accountId); 111 datas.WriteString(bundleName); 112 datas.WriteBool(status); 113 datas.RewindRead(0); 114 // SERVICE_CMD_CHANGE_APP_SWITCH 115 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_CHANGE_APP_SWITCH); 116 MessageParcel reply; 117 MessageOption option; 118 119 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 120 } 121 HandleCleanFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)122 void HandleCleanFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, FuzzData &fuzzData, size_t size) 123 { 124 fuzzData.ResetData(size); 125 MessageParcel datas; 126 if (!WriteInterfaceToken(datas)) { 127 return; 128 } 129 std::string uri = fuzzData.GetStringFromData(static_cast<int>(size)); 130 datas.WriteString(uri); 131 datas.RewindRead(0); 132 // SERVICE_CMD_CLEAN 133 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_CLEAN); 134 MessageParcel reply; 135 MessageOption option; 136 137 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 138 } 139 HandleDeleteAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)140 void HandleDeleteAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 141 FuzzData &fuzzData, 142 size_t size) 143 { 144 fuzzData.ResetData(size); 145 MessageParcel datas; 146 if (!WriteInterfaceToken(datas)) { 147 return; 148 } 149 int32_t userId = fuzzData.GetData<int32_t>(); 150 datas.WriteInt32(userId); 151 int len = static_cast<int>(size - U32_AT_SIZE); 152 std::string uri = fuzzData.GetStringFromData(len); 153 datas.WriteString(uri); 154 datas.RewindRead(0); 155 // SERVICE_CMD_DELETE_ASSET 156 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_DELETE_ASSET); 157 MessageParcel reply; 158 MessageOption option; 159 160 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 161 } 162 HandleDisableCloudFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)163 void HandleDisableCloudFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 164 FuzzData &fuzzData, 165 size_t size) 166 { 167 fuzzData.ResetData(size); 168 MessageParcel datas; 169 if (!WriteInterfaceToken(datas)) { 170 return; 171 } 172 string accountId = fuzzData.GetStringFromData(static_cast<int>(size)); 173 datas.WriteString(accountId); 174 datas.RewindRead(0); 175 // SERVICE_CMD_DISABLE_CLOUD 176 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_DISABLE_CLOUD); 177 MessageParcel reply; 178 MessageOption option; 179 180 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 181 } 182 HandleDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)183 void HandleDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 184 FuzzData &fuzzData, 185 size_t size) 186 { 187 fuzzData.ResetData(size); 188 MessageParcel datas; 189 if (!WriteInterfaceToken(datas)) { 190 return; 191 } 192 int32_t userId = fuzzData.GetData<int32_t>(); 193 datas.WriteInt32(userId); 194 int pos = static_cast<int>(size - U32_AT_SIZE) / (SPLITE_SIZE + 1); 195 string bundleName = fuzzData.GetStringFromData(pos); 196 datas.WriteString(bundleName); 197 AssetInfo assetInfo = {.uri = fuzzData.GetStringFromData(pos), 198 .recordType = fuzzData.GetStringFromData(pos), 199 .recordId = fuzzData.GetStringFromData(pos), 200 .fieldKey = fuzzData.GetStringFromData(pos), 201 .assetName = fuzzData.GetStringFromData(pos)}; 202 AssetInfoObj assetInfoObj(assetInfo); 203 datas.WriteParcelable(&assetInfoObj); 204 datas.RewindRead(0); 205 // SERVICE_CMD_DOWNLOAD_FILE 206 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_DOWNLOAD_FILE); 207 MessageParcel reply; 208 MessageOption option; 209 210 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 211 } 212 HandleEnableCloudFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)213 void HandleEnableCloudFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 214 FuzzData &fuzzData, 215 size_t size) 216 { 217 fuzzData.ResetData(size); 218 MessageParcel datas; 219 if (!WriteInterfaceToken(datas)) { 220 return; 221 } 222 int pos = static_cast<int>(size >> 1); 223 string accountId = fuzzData.GetStringFromData(pos); 224 datas.WriteString(accountId); 225 int itemStrLen = pos / SPLITE_SIZE; 226 if (itemStrLen <= static_cast<int>(BOOL_AT_SIZE)) { 227 return; 228 } 229 std::map<string, bool> switchData; 230 for (int i = 0; i < SPLITE_SIZE; i++) { 231 string itemStr = fuzzData.GetStringFromData(itemStrLen - static_cast<int>(BOOL_AT_SIZE)); 232 bool itemBool = fuzzData.GetData<bool>(); 233 switchData.insert(pair<string, bool>(itemStr, itemBool)); 234 } 235 SwitchDataObj switchDataObj; 236 switchDataObj.switchData = switchData; 237 datas.WriteParcelable(&switchDataObj); 238 datas.RewindRead(0); 239 // SERVICE_CMD_ENABLE_CLOUD 240 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_ENABLE_CLOUD); 241 MessageParcel reply; 242 MessageOption option; 243 244 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 245 } 246 HandleNotifyDataChangeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)247 void HandleNotifyDataChangeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 248 FuzzData &fuzzData, 249 size_t size) 250 { 251 fuzzData.ResetData(size); 252 MessageParcel datas; 253 if (!WriteInterfaceToken(datas)) { 254 return; 255 } 256 int pos = static_cast<int>(size >> 1); 257 string accountId = fuzzData.GetStringFromData(pos); 258 datas.WriteString(accountId); 259 string bundleName = fuzzData.GetStringFromData(pos); 260 datas.WriteString(bundleName); 261 datas.RewindRead(0); 262 // SERVICE_CMD_NOTIFY_DATA_CHANGE 263 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_NOTIFY_DATA_CHANGE); 264 MessageParcel reply; 265 MessageOption option; 266 267 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 268 } 269 HandleRegisterCallbackInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)270 void HandleRegisterCallbackInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 271 FuzzData &fuzzData, 272 size_t size) 273 { 274 fuzzData.ResetData(size); 275 MessageParcel datas; 276 if (!WriteInterfaceToken(datas)) { 277 return; 278 } 279 sptr<ICloudSyncCallbackTest> callback = new (std::nothrow) ICloudSyncCallbackTest(); 280 if (callback == nullptr) { 281 return; 282 } 283 datas.WriteRemoteObject(callback->AsObject().GetRefPtr()); 284 string bundleName = fuzzData.GetStringFromData(static_cast<int>(size)); 285 datas.WriteString(bundleName); 286 datas.RewindRead(0); 287 // SERVICE_CMD_REGISTER_CALLBACK 288 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_REGISTER_CALLBACK); 289 MessageParcel reply; 290 MessageOption option; 291 292 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 293 } 294 HandleRegisterDownloadFileCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)295 void HandleRegisterDownloadFileCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 296 FuzzData &fuzzData, 297 size_t size) 298 { 299 fuzzData.ResetData(size); 300 MessageParcel datas; 301 if (!WriteInterfaceToken(datas)) { 302 return; 303 } 304 sptr<ICloudDownloadCallbackTest> callback = new (std::nothrow) ICloudDownloadCallbackTest(); 305 if (callback == nullptr) { 306 return; 307 } 308 datas.WriteRemoteObject(callback->AsObject().GetRefPtr()); 309 datas.RewindRead(0); 310 // SERVICE_CMD_REGISTER_DOWNLOAD_FILE_CALLBACK 311 uint32_t code = 312 static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_REGISTER_DOWNLOAD_FILE_CALLBACK); 313 MessageParcel reply; 314 MessageOption option; 315 316 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 317 } 318 HandleStartDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)319 void HandleStartDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 320 FuzzData &fuzzData, 321 size_t size) 322 { 323 fuzzData.ResetData(size); 324 MessageParcel datas; 325 if (!WriteInterfaceToken(datas)) { 326 return; 327 } 328 string path = fuzzData.GetStringFromData(static_cast<int>(size)); 329 datas.WriteString(path); 330 datas.RewindRead(0); 331 // SERVICE_CMD_START_DOWNLOAD_FILE 332 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_START_DOWNLOAD_FILE); 333 MessageParcel reply; 334 MessageOption option; 335 336 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 337 } 338 HandleStartSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)339 void HandleStartSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 340 FuzzData &fuzzData, 341 size_t size) 342 { 343 fuzzData.ResetData(size); 344 MessageParcel datas; 345 if (!WriteInterfaceToken(datas)) { 346 return; 347 } 348 auto forceFlag = fuzzData.GetData<bool>(); 349 datas.WriteBool(forceFlag); 350 string bundleName = fuzzData.GetStringFromData(static_cast<int>(size - BOOL_AT_SIZE)); 351 datas.WriteString(bundleName); 352 datas.RewindRead(0); 353 // SERVICE_CMD_START_SYNC 354 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_START_SYNC); 355 MessageParcel reply; 356 MessageOption option; 357 358 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 359 } 360 HandleStopDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)361 void HandleStopDownloadFileFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 362 FuzzData &fuzzData, 363 size_t size) 364 { 365 fuzzData.ResetData(size); 366 MessageParcel datas; 367 if (!WriteInterfaceToken(datas)) { 368 return; 369 } 370 string path = fuzzData.GetStringFromData(static_cast<int>(size)); 371 datas.WriteString(path); 372 datas.RewindRead(0); 373 // SERVICE_CMD_STOP_DOWNLOAD_FILE 374 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_STOP_DOWNLOAD_FILE); 375 MessageParcel reply; 376 MessageOption option; 377 378 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 379 } 380 HandleStopSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,const uint8_t * data,size_t size)381 void HandleStopSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 382 const uint8_t *data, 383 size_t size) 384 { 385 MessageParcel datas; 386 if (!WriteInterfaceToken(datas)) { 387 return; 388 } 389 datas.WriteBuffer(data, size); 390 datas.RewindRead(0); 391 // SERVICE_CMD_STOP_SYNC 392 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_STOP_SYNC); 393 MessageParcel reply; 394 MessageOption option; 395 396 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 397 } 398 HandleUnRegisterCallbackInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)399 void HandleUnRegisterCallbackInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 400 FuzzData &fuzzData, 401 size_t size) 402 { 403 fuzzData.ResetData(size); 404 MessageParcel datas; 405 if (!WriteInterfaceToken(datas)) { 406 return; 407 } 408 string bundleName = fuzzData.GetStringFromData(static_cast<int>(size)); 409 datas.WriteString(bundleName); 410 datas.RewindRead(0); 411 // SERVICE_CMD_UNREGISTER_CALLBACK 412 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_UNREGISTER_CALLBACK); 413 MessageParcel reply; 414 MessageOption option; 415 416 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 417 } 418 HandleUnRegisterDownloadFileCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,const uint8_t * data,size_t size)419 void HandleUnRegisterDownloadFileCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 420 const uint8_t *data, 421 size_t size) 422 { 423 MessageParcel datas; 424 if (!WriteInterfaceToken(datas)) { 425 return; 426 } 427 datas.WriteBuffer(data, size); 428 datas.RewindRead(0); 429 // SERVICE_CMD_UNREGISTER_DOWNLOAD_FILE_CALLBACK 430 uint32_t code = 431 static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_UNREGISTER_DOWNLOAD_FILE_CALLBACK); 432 MessageParcel reply; 433 MessageOption option; 434 435 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 436 } 437 HandleUploadAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)438 void HandleUploadAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 439 FuzzData &fuzzData, 440 size_t size) 441 { 442 fuzzData.ResetData(size); 443 MessageParcel datas; 444 if (!WriteInterfaceToken(datas)) { 445 return; 446 } 447 int32_t userId = fuzzData.GetData<int32_t>(); 448 datas.WriteInt32(userId); 449 int len = static_cast<int32_t>(size - U32_AT_SIZE); 450 string request = fuzzData.GetStringFromData(len); 451 datas.WriteString(request); 452 datas.RewindRead(0); 453 // SERVICE_CMD_UPLOAD_ASSET 454 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_UPLOAD_ASSET); 455 MessageParcel reply; 456 MessageOption option; 457 458 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 459 } 460 HandleTriggerSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)461 void HandleTriggerSyncInnerFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 462 FuzzData &fuzzData, 463 size_t size) 464 { 465 fuzzData.ResetData(size); 466 MessageParcel datas; 467 if (!WriteInterfaceToken(datas)) { 468 return; 469 } 470 int len = static_cast<int32_t>(size - U32_AT_SIZE); 471 string bundleName = fuzzData.GetStringFromData(len); 472 datas.WriteString(bundleName); 473 int32_t userId = fuzzData.GetData<int32_t>(); 474 datas.WriteInt32(userId); 475 datas.RewindRead(0); 476 // SERVICE_CMD_TRIGGER_SYNC 477 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_TRIGGER_SYNC); 478 MessageParcel reply; 479 MessageOption option; 480 481 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 482 } 483 HandleNotifyEventChangeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)484 void HandleNotifyEventChangeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 485 FuzzData &fuzzData, 486 size_t size) 487 { 488 fuzzData.ResetData(size); 489 MessageParcel datas; 490 if (!WriteInterfaceToken(datas)) { 491 return; 492 } 493 int32_t userId = fuzzData.GetData<int32_t>(); 494 datas.WriteInt32(userId); 495 496 int pos = static_cast<int>((size - U32_AT_SIZE) >> 1); 497 string eventIdStr = fuzzData.GetStringFromData(pos); 498 string extraDataStr = fuzzData.GetStringFromData(pos); 499 datas.WriteString(eventIdStr); 500 datas.WriteString(extraDataStr); 501 datas.RewindRead(0); 502 // SERVICE_CMD_NOTIFY_EVENT_CHANGE 503 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_NOTIFY_EVENT_CHANGE); 504 MessageParcel reply; 505 MessageOption option; 506 507 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 508 } 509 HandleStartFileCacheFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)510 void HandleStartFileCacheFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 511 FuzzData &fuzzData, 512 size_t size) 513 { 514 fuzzData.ResetData(size); 515 MessageParcel datas; 516 if (!WriteInterfaceToken(datas)) { 517 return; 518 } 519 int32_t userId = fuzzData.GetData<int32_t>(); 520 datas.WriteInt32(userId); 521 int pos = static_cast<int>((size - U32_AT_SIZE) >> 1); 522 string eventIdStr = fuzzData.GetStringFromData(pos); 523 string extraDataStr = fuzzData.GetStringFromData(pos); 524 datas.WriteString(eventIdStr); 525 datas.WriteString(extraDataStr); 526 datas.RewindRead(0); 527 // SERVICE_CMD_START_FILE_CACHE 528 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_START_FILE_CACHE); 529 MessageParcel reply; 530 MessageOption option; 531 532 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 533 } 534 HandleDownloadFilesFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)535 void HandleDownloadFilesFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 536 FuzzData &fuzzData, 537 size_t size) 538 { 539 fuzzData.ResetData(size); 540 MessageParcel datas; 541 if (!WriteInterfaceToken(datas)) { 542 return; 543 } 544 int32_t userId = fuzzData.GetData<int32_t>(); 545 datas.WriteInt32(userId); 546 int32_t vecSize = fuzzData.GetData<int32_t>() % SPLITE_SIZE + 1; 547 auto remainSize = fuzzData.GetRemainSize(); 548 if (static_cast<int>(remainSize) <= vecSize * SPLITE_SIZE + 1) { 549 return; 550 } 551 int len = static_cast<int>(remainSize / (vecSize * SPLITE_SIZE + 1)); 552 string bundleName = fuzzData.GetStringFromData(len); 553 datas.WriteString(bundleName); 554 datas.WriteInt32(vecSize); 555 for (auto i = 0; i < vecSize; i++) { 556 AssetInfo assetInfo = {.uri = fuzzData.GetStringFromData(len), 557 .recordType = fuzzData.GetStringFromData(len), 558 .recordId = fuzzData.GetStringFromData(len), 559 .fieldKey = fuzzData.GetStringFromData(len), 560 .assetName = fuzzData.GetStringFromData(len)}; 561 AssetInfoObj assetInfoObj(assetInfo); 562 datas.WriteParcelable(&assetInfoObj); 563 } 564 datas.RewindRead(0); 565 // SERVICE_CMD_DOWNLOAD_FILES 566 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_DOWNLOAD_FILES); 567 MessageParcel reply; 568 MessageOption option; 569 570 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 571 } 572 HandleDownloadAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)573 void HandleDownloadAssetFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 574 FuzzData &fuzzData, 575 size_t size) 576 { 577 fuzzData.ResetData(size); 578 MessageParcel datas; 579 if (!WriteInterfaceToken(datas)) { 580 return; 581 } 582 uint64_t taskId = fuzzData.GetData<uint64_t>(); 583 datas.WriteUint64(taskId); 584 int32_t userId = fuzzData.GetData<int32_t>(); 585 datas.WriteUint32(userId); 586 int len = static_cast<int>(fuzzData.GetRemainSize() >> 1); 587 string bundleName = fuzzData.GetStringFromData(len); 588 datas.WriteString(bundleName); 589 string networkId = fuzzData.GetStringFromData(len); 590 datas.WriteString(networkId); 591 592 fuzzData.ResetData(size); 593 len = static_cast<int>(size) / SPLITE_SIZE; 594 AssetInfo assetInfo = {.uri = fuzzData.GetStringFromData(len), 595 .recordType = fuzzData.GetStringFromData(len), 596 .recordId = fuzzData.GetStringFromData(len), 597 .fieldKey = fuzzData.GetStringFromData(len), 598 .assetName = fuzzData.GetStringFromData(len)}; 599 AssetInfoObj assetInfoObj(assetInfo); 600 datas.WriteParcelable(&assetInfoObj); 601 datas.RewindRead(0); 602 // SERVICE_CMD_DOWNLOAD_ASSET 603 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_DOWNLOAD_ASSET); 604 MessageParcel reply; 605 MessageOption option; 606 607 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 608 } 609 HandleRegisterDownloadAssetCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)610 void HandleRegisterDownloadAssetCallbackFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 611 FuzzData &fuzzData, 612 size_t size) 613 { 614 fuzzData.ResetData(size); 615 MessageParcel datas; 616 if (!WriteInterfaceToken(datas)) { 617 return; 618 } 619 sptr<IDownloadAssetCallbackTest> callback = new (std::nothrow) IDownloadAssetCallbackTest(); 620 if (callback == nullptr) { 621 return; 622 } 623 datas.WriteRemoteObject(callback->AsObject().GetRefPtr()); 624 datas.RewindRead(0); 625 // SERVICE_CMD_REGISTER_DOWNLOAD_ASSET_CALLBACK 626 uint32_t code = 627 static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_REGISTER_DOWNLOAD_ASSET_CALLBACK); 628 MessageParcel reply; 629 MessageOption option; 630 631 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 632 } 633 HandleGetSyncTimeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)634 void HandleGetSyncTimeFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 635 FuzzData &fuzzData, 636 size_t size) 637 { 638 fuzzData.ResetData(size); 639 MessageParcel datas; 640 if (!WriteInterfaceToken(datas)) { 641 return; 642 } 643 string bundleName = fuzzData.GetStringFromData(static_cast<int>(size)); 644 datas.WriteString(bundleName); 645 datas.RewindRead(0); 646 // SERVICE_CMD_GET_SYNC_TIME 647 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_GET_SYNC_TIME); 648 MessageParcel reply; 649 MessageOption option; 650 651 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 652 } 653 HandleCleanCacheFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr,FuzzData & fuzzData,size_t size)654 void HandleCleanCacheFuzzTest(std::shared_ptr<CloudSyncServiceStub> cloudSyncServiceStubStr, 655 FuzzData &fuzzData, 656 size_t size) 657 { 658 fuzzData.ResetData(size); 659 MessageParcel datas; 660 if (!WriteInterfaceToken(datas)) { 661 return; 662 } 663 string uri = fuzzData.GetStringFromData(static_cast<int>(size)); 664 datas.WriteString(uri); 665 datas.RewindRead(0); 666 // SERVICE_CMD_CLEAN_CACHE 667 uint32_t code = static_cast<uint32_t>(CloudFileSyncServiceInterfaceCode::SERVICE_CMD_CLEAN_CACHE); 668 MessageParcel reply; 669 MessageOption option; 670 671 cloudSyncServiceStubStr->OnRemoteRequest(code, datas, reply, option); 672 } 673 } // namespace OHOS 674 675 /* Fuzzer entry point */ LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)676 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) 677 { 678 /* Run your code on data */ 679 if (data == nullptr || size < OHOS::U32_AT_SIZE * static_cast<size_t>(OHOS::SPLITE_SIZE)) { 680 return 0; 681 } 682 683 OHOS::NativeTokenGet(true); 684 auto cloudSyncServiceStubStr = 685 std::make_shared<OHOS::FileManagement::CloudSync::CloudSyncService>(OHOS::SERVICE_SA_ID); 686 if (cloudSyncServiceStubStr == nullptr) { 687 return false; 688 } 689 if (cloudSyncServiceStubStr->dataSyncManager_ == nullptr) { 690 cloudSyncServiceStubStr->dataSyncManager_ = 691 std::make_shared<OHOS::FileManagement::CloudFile::DataSyncManager>(); 692 } 693 694 OHOS::FuzzData fuzzData(data, size); 695 OHOS::HandleChangeAppSwitchFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 696 OHOS::HandleCleanFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 697 OHOS::HandleDeleteAssetFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 698 OHOS::HandleDisableCloudFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 699 OHOS::HandleDownloadFileFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 700 OHOS::HandleEnableCloudFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 701 OHOS::HandleNotifyDataChangeFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 702 OHOS::HandleRegisterCallbackInnerFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 703 OHOS::HandleRegisterDownloadFileCallbackFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 704 OHOS::HandleStartDownloadFileFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 705 OHOS::HandleStartSyncInnerFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 706 OHOS::HandleStopDownloadFileFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 707 OHOS::HandleStopSyncInnerFuzzTest(cloudSyncServiceStubStr, data, size); 708 OHOS::HandleUnRegisterCallbackInnerFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 709 OHOS::HandleUnRegisterDownloadFileCallbackFuzzTest(cloudSyncServiceStubStr, data, size); 710 OHOS::HandleUploadAssetFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 711 OHOS::HandleTriggerSyncInnerFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 712 OHOS::HandleNotifyEventChangeFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 713 OHOS::HandleStartFileCacheFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 714 OHOS::HandleDownloadFilesFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 715 OHOS::HandleDownloadAssetFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 716 OHOS::HandleRegisterDownloadAssetCallbackFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 717 OHOS::HandleGetSyncTimeFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 718 OHOS::HandleCleanCacheFuzzTest(cloudSyncServiceStubStr, fuzzData, size); 719 if (OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_ != nullptr) { 720 OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().queue_.wait( 721 OHOS::FileManagement::CloudSync::TaskStateManager::GetInstance().unloadTaskHandle_); 722 } 723 return 0; 724 } 725