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 "promiserejectinfo_fuzzer.h" 17#include "ecmascript/base/string_helper.h" 18#include "ecmascript/base/utf_helper.h" 19#include "ecmascript/napi/include/jsnapi.h" 20 21using namespace panda; 22using namespace panda::ecmascript; 23using namespace panda::ecmascript::base::utf_helper; 24 25namespace OHOS { 26 void PromiseRejectInfoNewFuzzTest(const uint8_t* data, size_t size) 27 { 28 RuntimeOption option; 29 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 30 EcmaVM *vm = JSNApi::CreateJSVM(option); 31 if (data == nullptr || size <= 0) { 32 LOG_ECMA(ERROR) << "illegal input!"; 33 return; 34 } 35 Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 36 Local<JSValueRef> promise(promiseStirng); 37 Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 38 Local<JSValueRef> reason(reasonString); 39 void *data2 = static_cast<void*>(new std::string("test")); 40 [[maybe_unused]]PromiseRejectInfo promiseReject(promise, reason, 41 PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2); 42 JSNApi::DestroyJSVM(vm); 43 } 44 45 void GetPromiseFuzzTest([[maybe_unused]]const uint8_t* data, size_t size) 46 { 47 RuntimeOption option; 48 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 49 EcmaVM *vm = JSNApi::CreateJSVM(option); 50 if (size <= 0) { 51 LOG_ECMA(ERROR) << "illegal input!"; 52 return; 53 } 54 Local<PromiseCapabilityRef> capability = PromiseCapabilityRef::New(vm); 55 [[maybe_unused]]Local<PromiseRef> promise = capability->GetPromise(vm); 56 JSNApi::DestroyJSVM(vm); 57 } 58 59 void GetDataFuzzTest(const uint8_t* data, size_t size) 60 { 61 RuntimeOption option; 62 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 63 EcmaVM *vm = JSNApi::CreateJSVM(option); 64 if (data == nullptr || size <= 0) { 65 LOG_ECMA(ERROR) << "illegal input!"; 66 return; 67 } 68 Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 69 Local<JSValueRef> promise(promiseStirng); 70 Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 71 Local<JSValueRef> reason(reasonString); 72 PromiseRejectInfo promiseReject(promise, reason, 73 PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, (void*)data); 74 promiseReject.GetData(); 75 JSNApi::DestroyJSVM(vm); 76 } 77 78 void PromiseRejectInfoGetPromiseFuzzTest(const uint8_t* data, size_t size) 79 { 80 RuntimeOption option; 81 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 82 EcmaVM *vm = JSNApi::CreateJSVM(option); 83 if (data == nullptr || size <= 0) { 84 LOG_ECMA(ERROR) << "illegal input!"; 85 return; 86 } 87 Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 88 Local<JSValueRef> promise(promiseStirng); 89 Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 90 Local<JSValueRef> reason(reasonString); 91 void *newdata = static_cast<void*>(new std::string("test")); 92 PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, newdata); 93 promiseReject.GetPromise(); 94 JSNApi::DestroyJSVM(vm); 95 } 96 97 void PromiseRejectInfoGetReasonFuzzTest(const uint8_t* data, size_t size) 98 { 99 RuntimeOption option; 100 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 101 EcmaVM *vm = JSNApi::CreateJSVM(option); 102 if (data == nullptr || size <= 0) { 103 LOG_ECMA(ERROR) << "illegal input!"; 104 return; 105 } 106 Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 107 Local<JSValueRef> promise(promiseStirng); 108 Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 109 Local<JSValueRef> reason(reasonString); 110 void *data2 = static_cast<void*>(new std::string("test")); 111 PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2); 112 [[maybe_unused]]Local<JSValueRef> reason_res = promiseReject.GetReason(); 113 JSNApi::DestroyJSVM(vm); 114 } 115 116 void PromiseRejectInfoGetOperationFuzzTest(const uint8_t* data, size_t size) 117 { 118 RuntimeOption option; 119 option.SetLogLevel(RuntimeOption::LOG_LEVEL::ERROR); 120 EcmaVM *vm = JSNApi::CreateJSVM(option); 121 if (data == nullptr || size <= 0) { 122 LOG_ECMA(ERROR) << "illegal input!"; 123 return; 124 } 125 Local<StringRef> promiseStirng = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 126 Local<JSValueRef> promise(promiseStirng); 127 Local<StringRef> reasonString = StringRef::NewFromUtf8(vm, (char*)data, (int)size); 128 Local<JSValueRef> reason(reasonString); 129 void *data2 = static_cast<void*>(new std::string("test")); 130 PromiseRejectInfo promiseReject(promise, reason, PromiseRejectInfo::PROMISE_REJECTION_EVENT::REJECT, data2); 131 promiseReject.GetOperation(); 132 JSNApi::DestroyJSVM(vm); 133 } 134} 135 136// Fuzzer entry point. 137extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) 138{ 139 // Run your code on data. 140 OHOS::PromiseRejectInfoNewFuzzTest(data, size); 141 OHOS::GetPromiseFuzzTest(data, size); 142 OHOS::GetDataFuzzTest(data, size); 143 OHOS::PromiseRejectInfoGetPromiseFuzzTest(data, size); 144 OHOS::PromiseRejectInfoGetReasonFuzzTest(data, size); 145 OHOS::PromiseRejectInfoGetOperationFuzzTest(data, size); 146 return 0; 147}