From ca2871e4af737b56fc8f89340a927ad6f09cdbd2 Mon Sep 17 00:00:00 2001 From: zWX1234017 Date: Thu, 14 Aug 2025 16:39:47 +0800 Subject: [PATCH] Fix out of bounds access std: string alarm https://gitee.com/openharmony/commonlibrary_ets_utils/issues/ICSZFK Signed-off-by: zWX1234017 --- js_api_module/buffer/native_module_buffer.cpp | 16 +- js_api_module/convertxml/js_convertxml.cpp | 6 +- js_api_module/uri/native_module_uri.cpp | 122 ++++--------- js_api_module/uri/test/test_napi.cpp | 14 +- js_api_module/url/js_url.cpp | 97 +++-------- js_api_module/url/js_url.h | 1 + js_api_module/url/native_module_url.cpp | 160 +++--------------- js_api_module/url/test/test_napi.cpp | 55 +++--- js_api_module/xml/js_xml.cpp | 6 +- js_api_module/xml/js_xml_dynamic.cpp | 6 +- js_api_module/xml/test/test_xml.cpp | 51 +++--- js_sys_module/dfx/native_module_dfx.cpp | 21 ++- js_sys_module/process/js_childprocess.cpp | 12 +- js_sys_module/process/js_process.cpp | 89 +++------- js_sys_module/process/js_process.h | 1 + js_sys_module/test/test_process.cpp | 23 +-- js_util_module/util/js_uuid.cpp | 7 +- js_util_module/util/native_module_util.cpp | 71 +++----- platform/default/util_helper.cpp | 18 +- platform/ohos/util_helper.cpp | 13 +- 20 files changed, 264 insertions(+), 525 deletions(-) diff --git a/js_api_module/buffer/native_module_buffer.cpp b/js_api_module/buffer/native_module_buffer.cpp index 559f5485..2e4982b0 100644 --- a/js_api_module/buffer/native_module_buffer.cpp +++ b/js_api_module/buffer/native_module_buffer.cpp @@ -59,10 +59,18 @@ static string GetStringUtf8(napi_env env, napi_value strValue) { string str = ""; size_t strSize = 0; - NAPI_CALL(env, napi_get_value_string_utf8(env, strValue, nullptr, 0, &strSize)); - str.reserve(strSize + 1); - str.resize(strSize); - NAPI_CALL(env, napi_get_value_string_utf8(env, strValue, const_cast(str.data()), strSize + 1, &strSize)); + napi_status status = napi_get_value_string_utf8(env, strValue, nullptr, 0, &strSize); + if (status != napi_ok) { + HILOG_ERROR("Buffer:: can not get str size"); + return str; + } + std::vector argvBuf(strSize + 1); + status = napi_get_value_string_utf8(env, strValue, argvBuf.data(), argvBuf.size(), &strSize); + if (status != napi_ok) { + HILOG_ERROR("Buffer:: can not get str value"); + return str; + } + str.assign(argvBuf.data(), strSize); int pos = count(str.begin(), str.end(), '\0'); if (pos != 0) { str.resize(strSize); diff --git a/js_api_module/convertxml/js_convertxml.cpp b/js_api_module/convertxml/js_convertxml.cpp index 460d2465..800dba71 100644 --- a/js_api_module/convertxml/js_convertxml.cpp +++ b/js_api_module/convertxml/js_convertxml.cpp @@ -349,14 +349,14 @@ namespace OHOS::Xml { HILOG_ERROR("ConvertXml:: can not get buffer size"); return status; } - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); if (bufferSize > 0) { - status = napi_get_value_string_utf8(env, napi_StrValue, buffer.data(), bufferSize + 1, &bufferSize); + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, napi_StrValue, argvBuf.data(), bufferSize + 1, &bufferSize); if (status != napi_ok) { HILOG_ERROR("ConvertXml:: can not get buffer value"); return status; } + buffer.assign(argvBuf.data(), bufferSize); } if (buffer.data() != nullptr) { result = buffer; diff --git a/js_api_module/uri/native_module_uri.cpp b/js_api_module/uri/native_module_uri.cpp index 94ef0c85..c6967434 100644 --- a/js_api_module/uri/native_module_uri.cpp +++ b/js_api_module/uri/native_module_uri.cpp @@ -21,6 +21,24 @@ extern const char _binary_uri_abc_start[]; extern const char _binary_uri_abc_end[]; namespace OHOS::Uri { + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString) + { + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len); + if (status != napi_ok) { + HILOG_ERROR("URI:: can not get str size"); + return false; + } + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("URI:: can not get str value"); + return false; + } + jsString.assign(argvBuf.data(), len); + return true; + } + static napi_value UriConstructor(napi_env env, napi_callback_info info) { napi_value thisVar = nullptr; @@ -33,11 +51,9 @@ namespace OHOS::Uri { NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype)); if (valuetype == napi_string) { std::string type = ""; - size_t typelen = 0; - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen)); - type.reserve(typelen + 1); - type.resize(typelen); - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], type.data(), typelen + 1, &typelen)); + if (!GetStringFromJS(env, argv[0], type)) { + return nullptr; + } object = new (std::nothrow) Uri(type); if (object == nullptr) { HILOG_ERROR("UriConstructor:: memory allocation failed, object is nullptr"); @@ -164,26 +180,19 @@ namespace OHOS::Uri { { napi_value thisVar = nullptr; napi_value result = nullptr; + napi_get_null(env, &result); size_t argc = 2; napi_value argv[2] = { nullptr }; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); Uri *muri = nullptr; NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast(&muri))); std::string key = ""; - size_t keyLen = 0; - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &keyLen)); - key.reserve(keyLen + 1); - key.resize(keyLen); - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], key.data(), keyLen + 1, &keyLen)); std::string value = ""; - size_t valueLen = 0; - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[1], nullptr, 0, &valueLen)); - value.reserve(valueLen + 1); - value.resize(valueLen); - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[1], value.data(), valueLen + 1, &valueLen)); + if (!GetStringFromJS(env, argv[0], key) || !GetStringFromJS(env, argv[1], value)) { + return result; + } std::string temp = muri->AddQueryValue(key, value); if (temp.empty()) { - napi_get_null(env, &result); return result; } size_t templen = temp.size(); @@ -195,20 +204,18 @@ namespace OHOS::Uri { { napi_value thisVar = nullptr; napi_value result = nullptr; + napi_get_null(env, &result); size_t argc = 1; napi_value argv[1] = { nullptr }; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); Uri *muri = nullptr; NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast(&muri))); std::string segment = ""; - size_t segmentLen = 0; - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], nullptr, 0, &segmentLen)); - segment.reserve(segmentLen + 1); - segment.resize(segmentLen); - NAPI_CALL(env, napi_get_value_string_utf8(env, argv[0], segment.data(), segmentLen + 1, &segmentLen)); + if (!GetStringFromJS(env, argv[0], segment)) { + return result; + } std::string temp = muri->AddSegment(segment); if (temp.empty()) { - napi_get_null(env, &result); return result; } size_t tempLen = temp.size(); @@ -228,15 +235,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string scheme = ""; - size_t schemeLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &schemeLen) != napi_ok) { - HILOG_ERROR("URI:: can not get scheme size"); - return nullptr; - } - scheme.reserve(schemeLen + 1); - scheme.resize(schemeLen); - if (napi_get_value_string_utf8(env, argv[0], scheme.data(), schemeLen + 1, &schemeLen) != napi_ok) { - HILOG_ERROR("URI:: can not get scheme value"); + if (!GetStringFromJS(env, argv[0], scheme)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -261,15 +260,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string userInfo = ""; - size_t userInfoLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &userInfoLen) != napi_ok) { - HILOG_ERROR("URI:: can not get userInfo size"); - return nullptr; - } - userInfo.reserve(userInfoLen + 1); - userInfo.resize(userInfoLen); - if (napi_get_value_string_utf8(env, argv[0], userInfo.data(), userInfoLen + 1, &userInfoLen) != napi_ok) { - HILOG_ERROR("URI:: can not get userInfo value"); + if (!GetStringFromJS(env, argv[0], userInfo)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -294,15 +285,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string pathStr = ""; - size_t pathLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &pathLen) != napi_ok) { - HILOG_ERROR("URI:: can not get pathStr size"); - return nullptr; - } - pathStr.reserve(pathLen + 1); - pathStr.resize(pathLen); - if (napi_get_value_string_utf8(env, argv[0], pathStr.data(), pathLen + 1, &pathLen) != napi_ok) { - HILOG_ERROR("URI:: can not get pathStr value"); + if (!GetStringFromJS(env, argv[0], pathStr)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -327,15 +310,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string fragmentStr = ""; - size_t fragmentLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &fragmentLen) != napi_ok) { - HILOG_ERROR("URI:: can not get fragmentStr size"); - return nullptr; - } - fragmentStr.reserve(fragmentLen + 1); - fragmentStr.resize(fragmentLen); - if (napi_get_value_string_utf8(env, argv[0], fragmentStr.data(), fragmentLen + 1, &fragmentLen) != napi_ok) { - HILOG_ERROR("URI:: can not get fragmentStr value"); + if (!GetStringFromJS(env, argv[0], fragmentStr)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -360,15 +335,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string queryStr = ""; - size_t queryLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &queryLen) != napi_ok) { - HILOG_ERROR("URI:: can not get queryStr size"); - return nullptr; - } - queryStr.reserve(queryLen + 1); - queryStr.resize(queryLen); - if (napi_get_value_string_utf8(env, argv[0], queryStr.data(), queryLen + 1, &queryLen) != napi_ok) { - HILOG_ERROR("URI:: can not get queryStr value"); + if (!GetStringFromJS(env, argv[0], queryStr)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -393,16 +360,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string authorityStr = ""; - size_t authorityStrLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &authorityStrLen) != napi_ok) { - HILOG_ERROR("URI:: can not get authorityStr size"); - return nullptr; - } - authorityStr.reserve(authorityStrLen + 1); - authorityStr.resize(authorityStrLen); - if (napi_get_value_string_utf8(env, argv[0], authorityStr.data(), - authorityStrLen + 1, &authorityStrLen) != napi_ok) { - HILOG_ERROR("URI:: can not get authorityStr value"); + if (!GetStringFromJS(env, argv[0], authorityStr)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { @@ -427,15 +385,7 @@ namespace OHOS::Uri { } Uri *muri = nullptr; std::string sspStr = ""; - size_t sspStrLen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &sspStrLen) != napi_ok) { - HILOG_ERROR("URI:: can not get authorityStr size"); - return nullptr; - } - sspStr.reserve(sspStrLen + 1); - sspStr.resize(sspStrLen); - if (napi_get_value_string_utf8(env, argv[0], sspStr.data(), sspStrLen + 1, &sspStrLen) != napi_ok) { - HILOG_ERROR("URI:: can not get authorityStr value"); + if (!GetStringFromJS(env, argv[0], sspStr)) { return nullptr; } if (napi_unwrap(env, thisVar, reinterpret_cast(&muri)) != napi_ok) { diff --git a/js_api_module/uri/test/test_napi.cpp b/js_api_module/uri/test/test_napi.cpp index 3eb99c8e..c78dc047 100644 --- a/js_api_module/uri/test/test_napi.cpp +++ b/js_api_module/uri/test/test_napi.cpp @@ -741,15 +741,18 @@ std::string GetStringUtf8(napi_env env, napi_value str) { std::string buffer = ""; size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, str, nullptr, 0, &bufferSize) != napi_ok) { + napi_status status = napi_get_value_string_utf8(env, str, nullptr, 0, &bufferSize); + if (status != napi_ok) { HILOG_ERROR("can not get src size"); return buffer; } - buffer.resize(bufferSize); - if (napi_get_value_string_utf8(env, str, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, str, argvBuf.data(), argvBuf.size(), &bufferSize); + if (status != napi_ok) { HILOG_ERROR("can not get src value"); return buffer; } + buffer.assign(argvBuf.data(), bufferSize); return buffer; } @@ -775,11 +778,12 @@ std::vector GetArray(napi_env env, const napi_value tempStr) } if (strLength > 0) { std::string itemStr = ""; - itemStr.resize(strLength); - if (napi_get_value_string_utf8(env, napiStr, itemStr.data(), strLength + 1, &strLength) != napi_ok) { + std::vector argvBuf(strLength + 1); + if (napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &strLength) != napi_ok) { HILOG_ERROR("can not get napiStr size"); return strVec; } + itemStr.assign(argvBuf.data(), strLength); strVec.push_back(itemStr); } else { strVec.push_back(""); diff --git a/js_api_module/url/js_url.cpp b/js_api_module/url/js_url.cpp index 85d127c2..b99de856 100644 --- a/js_api_module/url/js_url.cpp +++ b/js_api_module/url/js_url.cpp @@ -1800,15 +1800,7 @@ namespace OHOS::Url { napi_value URLSearchParams::Get(napi_env env, napi_value buffer) { std::string name = ""; - size_t nameSize = 0; - if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer size"); - return nullptr; - } - name.reserve(nameSize + 1); - name.resize(nameSize); - if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer value"); + if (!GetStringFromJS(env, buffer, name)) { return nullptr; } std::string sname = name; @@ -1831,15 +1823,7 @@ namespace OHOS::Url { napi_value URLSearchParams::GetAll(napi_env env, napi_value buffer) { std::string name = ""; - size_t nameSize = 0; - if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer size"); - return nullptr; - } - name.reserve(nameSize + 1); - name.resize(nameSize); - if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer value"); + if (!GetStringFromJS(env, buffer, name)) { return nullptr; } std::string sname = name; @@ -1866,28 +1850,12 @@ namespace OHOS::Url { void URLSearchParams::Append(napi_env env, napi_value buffer, napi_value temp) { std::string name = ""; - size_t nameSize = 0; - if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer size"); - return; - } - name.reserve(nameSize + 1); - name.resize(nameSize); - if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer value"); + if (!GetStringFromJS(env, buffer, name)) { return; } std::string tempName = name; std::string value = ""; - size_t valueSize = 0; - if (napi_get_value_string_utf8(env, temp, nullptr, 0, &valueSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get temp size"); - return; - } - value.reserve(valueSize + 1); - value.resize(valueSize); - if (napi_get_value_string_utf8(env, temp, value.data(), valueSize + 1, &valueSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get temp value"); + if (!GetStringFromJS(env, temp, value)) { return; } std::string tempValue = value; @@ -1897,15 +1865,7 @@ namespace OHOS::Url { void URLSearchParams::Delete(napi_env env, napi_value buffer) { std::string name = ""; - size_t nameSize = 0; - if (napi_get_value_string_utf8(env, buffer, nullptr, 0, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer size"); - return; - } - name.reserve(nameSize + 1); - name.resize(nameSize); - if (napi_get_value_string_utf8(env, buffer, name.data(), nameSize + 1, &nameSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get buffer value"); + if (!GetStringFromJS(env, buffer, name)) { return; } std::string sname = name; @@ -1944,16 +1904,8 @@ namespace OHOS::Url { napi_value URLSearchParams::IsHas(napi_env env, napi_value name) const { - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get name size"); - return nullptr; - } std::string buf = ""; - buf.reserve(bufferSize + 1); - buf.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, buf.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get name value"); + if (!GetStringFromJS(env, name, buf)) { return nullptr; } bool flag = false; @@ -1972,28 +1924,12 @@ namespace OHOS::Url { void URLSearchParams::Set(napi_env env, napi_value name, napi_value value) { std::string buffer = ""; - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get name size"); - return; - } - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get name value"); + if (!GetStringFromJS(env, name, buffer)) { return; } std::string cppName = buffer; std::string temp = ""; - size_t tempSize = 0; - if (napi_get_value_string_utf8(env, value, nullptr, 0, &tempSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get value size"); - return; - } - temp.reserve(tempSize + 1); - temp.resize(tempSize); - if (napi_get_value_string_utf8(env, value, temp.data(), tempSize + 1, &tempSize) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get value value"); + if (!GetStringFromJS(env, value, temp)) { return; } std::string cppValue = temp; @@ -2096,4 +2032,21 @@ namespace OHOS::Url { } return arr; } + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString) + { + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len); + if (status != napi_ok) { + HILOG_ERROR("URL:: can not get str size"); + return false; + } + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("URL:: can not get str value"); + return false; + } + jsString.assign(argvBuf.data(), len); + return true; + } } // namespace OHOS::Url diff --git a/js_api_module/url/js_url.h b/js_api_module/url/js_url.h index b2483b91..64257396 100644 --- a/js_api_module/url/js_url.h +++ b/js_api_module/url/js_url.h @@ -104,6 +104,7 @@ namespace OHOS::Url { void IPv6Host(std::string& input, std::string& host, std::bitset(BitsetStatusFlag::BIT_STATUS_11)>& flags); std::string BasePathToStr(UrlData& urlData); + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString); class URL { public: /** diff --git a/js_api_module/url/native_module_url.cpp b/js_api_module/url/native_module_url.cpp index ce29dec3..7d648168 100644 --- a/js_api_module/url/native_module_url.cpp +++ b/js_api_module/url/native_module_url.cpp @@ -36,30 +36,13 @@ namespace OHOS::Url { if (valuetype1 == napi_string) { std::string temp = ""; std::string tempType = ""; - size_t tempSize = 0; - size_t tempTypeSize = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &tempSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[0] size"); - return; - } - temp.reserve(tempSize + 1); - temp.resize(tempSize); - if (napi_get_value_string_utf8(env, argv[0], temp.data(), tempSize + 1, &tempSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], temp)) { return; } std::string input = temp; napi_typeof(env, argv[1], &valuetype2); if (valuetype2 == napi_string) { - if (napi_get_value_string_utf8(env, argv[1], nullptr, 0, &tempTypeSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[1] size"); - return; - } - tempType.reserve(tempTypeSize + 1); - tempType.resize(tempTypeSize); - if (napi_get_value_string_utf8(env, argv[1], tempType.data(), - tempTypeSize + 1, &tempTypeSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[1] value"); + if (!GetStringFromJS(env, argv[1], tempType)) { return; } std::string base = tempType; @@ -103,15 +86,7 @@ namespace OHOS::Url { NAPI_CALL(env, napi_typeof(env, argv[0], &valuetype)); if (valuetype == napi_string) { std::string type = ""; - size_t typeSize = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[0] size"); - return nullptr; - } - type.reserve(typeSize + 1); - type.resize(typeSize); - if (napi_get_value_string_utf8(env, argv[0], type.data(), typeSize + 1, &typeSize) != napi_ok) { - HILOG_ERROR("UrlStructor:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], type)) { return nullptr; } std::string input = type; @@ -284,15 +259,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -310,15 +277,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -336,15 +295,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -362,15 +313,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -388,15 +331,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -417,15 +352,7 @@ namespace OHOS::Url { HILOG_ERROR("URL:: can not get thisVar"); return nullptr; } - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -449,15 +376,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -475,15 +394,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -501,15 +412,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -527,15 +430,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -553,15 +448,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr)); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URL:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } URL *murl = nullptr; @@ -609,6 +496,8 @@ namespace OHOS::Url { std::vector vec; size_t arraySize = 0; napi_value napiStr = nullptr; + napi_status status = napi_ok; + for (size_t i = 0; i < length; i++) { napi_get_element(env, argv[0], i, &napiStr); if (napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize) != napi_ok) { @@ -617,12 +506,13 @@ namespace OHOS::Url { } if (arraySize > 0) { std::string cstr = ""; - cstr.reserve(arraySize + 1); - cstr.resize(arraySize); - if (napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize) != napi_ok) { + std::vector argvBuf(arraySize + 1); + status = napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + if (status != napi_ok) { HILOG_ERROR("URLSearchParams:: can not get name value"); return nullptr; } + cstr.assign(argvBuf.data(), arraySize); vec.push_back(cstr); } else { vec.push_back(""); @@ -817,15 +707,7 @@ namespace OHOS::Url { size_t argc = 1; std::string input = ""; napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr); - size_t typelen = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typelen) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get argv[0] size"); - return nullptr; - } - input.reserve(typelen + 1); - input.resize(typelen); - if (napi_get_value_string_utf8(env, argv[0], input.data(), typelen + 1, &typelen) != napi_ok) { - HILOG_ERROR("URLSearchParams:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], input)) { return nullptr; } std::vector params{}; diff --git a/js_api_module/url/test/test_napi.cpp b/js_api_module/url/test/test_napi.cpp index d2f4db87..55595a1a 100644 --- a/js_api_module/url/test/test_napi.cpp +++ b/js_api_module/url/test/test_napi.cpp @@ -41,26 +41,19 @@ napi_status DealNapiStrValue(napi_env env, const napi_value napiStr, std::string &result) { - std::string buffer = ""; - size_t bufferSize = 0; - napi_status status = napi_ok; - status = napi_get_value_string_utf8(env, napiStr, nullptr, -1, &bufferSize); - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, napiStr, nullptr, 0, &len); if (status != napi_ok) { - HILOG_ERROR("can not get buffer size"); + HILOG_ERROR("URL:: can not get str size"); return status; } - if (bufferSize > 0) { - status = napi_get_value_string_utf8(env, napiStr, buffer.data(), bufferSize + 1, &bufferSize); - if (status != napi_ok) { - HILOG_ERROR("can not get buffer value"); - return status; - } - } - if (buffer.data() != nullptr) { - result = buffer; + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("URL:: can not get str value"); + return status; } + result.assign(argvBuf.data(), len); return status; } @@ -182,11 +175,13 @@ static std::vector GetParamsStrig(napi_env env, const napi_value te } if (arraySize > 0) { std::string cstr = ""; - cstr.resize(arraySize); - if (napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize) != napi_ok) { - HILOG_ERROR("can not get napiStr size"); + std::vector argvBuf(arraySize + 1); + napi_status status = napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + if (status != napi_ok) { + HILOG_ERROR("can not get napiStr value"); return vec; } + cstr.assign(argvBuf.data(), arraySize); vec.push_back(cstr); } else { vec.push_back(""); @@ -1692,7 +1687,9 @@ HWTEST_F(NativeEngineTest, testUrlSearchParamsSetArray, testing::ext::TestSize.L napi_get_element(env, result, i, &napiStr); napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize); if (arraySize > 0) { - napi_get_value_string_utf8(env, napiStr, cstr1.data(), arraySize + 1, &arraySize); + std::vector argvBuf(arraySize + 1); + napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + cstr1.assign(argvBuf.data(), arraySize); } if (i == 0) { ASSERT_STREQ("jk", cstr1.data()); @@ -1722,7 +1719,9 @@ HWTEST_F(NativeEngineTest, testUrlSearchParamsIterByKeys, testing::ext::TestSize napi_get_element(env, result, i, &napiStr); napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize); if (arraySize > 0) { - napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize); + std::vector argvBuf(arraySize + 1); + napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + cstr.assign(argvBuf.data(), arraySize); } } ASSERT_STREQ(cstr.data(), "jk"); @@ -1748,7 +1747,9 @@ HWTEST_F(NativeEngineTest, testUrlSearchParamsIterByValues, testing::ext::TestSi napi_get_element(env, result, i, &napiStr); napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize); if (arraySize > 0) { - napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize); + std::vector argvBuf(arraySize + 1); + napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + cstr.assign(argvBuf.data(), arraySize); } } ASSERT_STREQ(cstr.data(), "ma"); @@ -1777,7 +1778,9 @@ HWTEST_F(NativeEngineTest, testUrlSearchParamsEntries001, testing::ext::TestSize napi_get_element(env, result, i, &napiStr); napi_get_value_string_utf8(env, napiStr, nullptr, 0, &arraySize); if (arraySize > 0) { - napi_get_value_string_utf8(env, napiStr, cstr.data(), arraySize + 1, &arraySize); + std::vector argvBuf(arraySize + 1); + napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &arraySize); + cstr.assign(argvBuf.data(), arraySize); } } ASSERT_EQ(length, 3); @@ -1877,11 +1880,13 @@ std::string GetStringUtf8(napi_env env, napi_value str) HILOG_ERROR("can not get src size"); return buffer; } - buffer.resize(bufferSize); - if (napi_get_value_string_utf8(env, str, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { + std::vector argvBuf(bufferSize + 1); + napi_status status = napi_get_value_string_utf8(env, str, argvBuf.data(), argvBuf.size(), &bufferSize); + if (status != napi_ok) { HILOG_ERROR("can not get src value"); return buffer; } + buffer.assign(argvBuf.data(), bufferSize); return buffer; } diff --git a/js_api_module/xml/js_xml.cpp b/js_api_module/xml/js_xml.cpp index d109cb91..b91077d8 100644 --- a/js_api_module/xml/js_xml.cpp +++ b/js_api_module/xml/js_xml.cpp @@ -25,18 +25,18 @@ namespace OHOS::xml { size_t bufferSize = 0; napi_status status = napi_ok; status = napi_get_value_string_utf8(env, napiStr, nullptr, -1, &bufferSize); - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); if (status != napi_ok) { HILOG_ERROR("XmlSerializer:: can not get buffer size"); return status; } if (bufferSize > 0) { - status = napi_get_value_string_utf8(env, napiStr, buffer.data(), bufferSize + 1, &bufferSize); + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &bufferSize); if (status != napi_ok) { HILOG_ERROR("XmlSerializer:: can not get buffer value"); return status; } + buffer.assign(argvBuf.data(), bufferSize); } if (buffer.data() != nullptr) { result = buffer; diff --git a/js_api_module/xml/js_xml_dynamic.cpp b/js_api_module/xml/js_xml_dynamic.cpp index b8c9fb8e..f36a9e22 100644 --- a/js_api_module/xml/js_xml_dynamic.cpp +++ b/js_api_module/xml/js_xml_dynamic.cpp @@ -28,14 +28,14 @@ namespace OHOS::xml { HILOG_ERROR("XmlDynamicSerializer:: can not get buffer size"); return status; } - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); if (bufferSize > 0) { - status = napi_get_value_string_utf8(env, napiStr, buffer.data(), bufferSize + 1, &bufferSize); + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, napiStr, argvBuf.data(), argvBuf.size(), &bufferSize); if (status != napi_ok) { HILOG_ERROR("XmlDynamicSerializer:: can not get buffer value"); return status; } + buffer.assign(argvBuf.data(), bufferSize); } if (buffer.data() != nullptr) { result = buffer; diff --git a/js_api_module/xml/test/test_xml.cpp b/js_api_module/xml/test/test_xml.cpp index 24305c3b..f7222efe 100644 --- a/js_api_module/xml/test/test_xml.cpp +++ b/js_api_module/xml/test/test_xml.cpp @@ -42,6 +42,24 @@ using namespace OHOS::xml; } static std::string g_testStr = ""; +bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString) +{ + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str size"); + return false; + } + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str value"); + return false; + } + jsString.assign(argvBuf.data(), len); + return true; +} + napi_value Method(napi_env env, napi_callback_info info) { napi_value thisVar = nullptr; @@ -54,18 +72,10 @@ napi_value Method(napi_env env, napi_callback_info info) napi_value value = args[1]; std::string buffer1 = ""; - size_t bufferSize1 = 0; - napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize1); - buffer1.reserve(bufferSize1 + 1); - buffer1.resize(bufferSize1); - napi_get_value_string_utf8(env, name, buffer1.data(), bufferSize1 + 1, &bufferSize1); + GetStringFromJS(env, name, buffer1); std::string buffer2 = ""; - size_t bufferSize2 = 0; - napi_get_value_string_utf8(env, value, nullptr, 0, &bufferSize2); - buffer2.reserve(bufferSize2 + 1); - buffer2.resize(bufferSize2); - napi_get_value_string_utf8(env, value, buffer2.data(), bufferSize2 + 1, &bufferSize2); + GetStringFromJS(env, value, buffer2); g_testStr += buffer1 + buffer2; napi_value result = nullptr; napi_get_boolean(env, true, &result); @@ -81,25 +91,14 @@ napi_value AttrWithTagFunc(napi_env env, napi_callback_info info) NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); std::string tagName = ""; - size_t tagNameSize = 0; - napi_get_value_string_utf8(env, args[0], nullptr, 0, &tagNameSize); - tagName.reserve(tagNameSize + 1); - tagName.resize(tagNameSize); - napi_get_value_string_utf8(env, args[0], tagName.data(), tagNameSize + 1, &tagNameSize); + GetStringFromJS(env, args[0], tagName); std::string attribute = ""; - size_t attributeSize = 0; - napi_get_value_string_utf8(env, args[1], nullptr, 0, &attributeSize); - attribute.reserve(attributeSize + 1); - attribute.resize(attributeSize); - napi_get_value_string_utf8(env, args[1], attribute.data(), attributeSize + 1, &attributeSize); - + GetStringFromJS(env, args[1], attribute); + std::string value = ""; - size_t valueSize = 0; - napi_get_value_string_utf8(env, args[2], nullptr, 0, &valueSize); // 2:the third arg - value.reserve(valueSize + 1); - value.resize(valueSize); - napi_get_value_string_utf8(env, args[2], value.data(), valueSize + 1, &valueSize); // 2:the third arg + GetStringFromJS(env, args[2], value); // 2: number of arguments + g_testStr += tagName + ' ' + attribute + ' ' + value + ' '; napi_value result = nullptr; napi_get_boolean(env, true, &result); diff --git a/js_sys_module/dfx/native_module_dfx.cpp b/js_sys_module/dfx/native_module_dfx.cpp index a9d3ada5..aaa499d8 100644 --- a/js_sys_module/dfx/native_module_dfx.cpp +++ b/js_sys_module/dfx/native_module_dfx.cpp @@ -28,16 +28,19 @@ namespace OHOS::JsSysModule::Dfx { napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); std::string tempStr = ""; size_t tempStrsize = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &tempStrsize) != napi_ok) { + napi_status status = napi_get_value_string_utf8(env, argv[0], nullptr, 0, &tempStrsize); + if (status != napi_ok) { HILOG_ERROR("can not get argv[0] size"); return nullptr; } - tempStr.reserve(tempStrsize + 1); - tempStr.resize(tempStrsize); - if (napi_get_value_string_utf8(env, argv[0], tempStr.data(), tempStrsize + 1, &tempStrsize) != napi_ok) { + std::vector argvBuf(tempStrsize + 1); + status = napi_get_value_string_utf8(env, argv[0], argvBuf.data(), argvBuf.size(), &tempStrsize); + if (status != napi_ok) { HILOG_ERROR("can not get argv[0] value"); return nullptr; } + tempStr.assign(argvBuf.data(), tempStrsize); + std::string pathStr = tempStr; bool isVmMode = true; napi_get_value_bool(env, argv[1], &isVmMode); @@ -97,16 +100,18 @@ namespace OHOS::JsSysModule::Dfx { napi_get_cb_info(env, info, &argc, &argv, nullptr, nullptr); std::string tempStr = ""; size_t tempStrsize = 0; - if (napi_get_value_string_utf8(env, argv, nullptr, 0, &tempStrsize) != napi_ok) { + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &tempStrsize); + if (status != napi_ok) { HILOG_ERROR("can not get argv size"); return nullptr; } - tempStr.reserve(tempStrsize + 1); - tempStr.resize(tempStrsize); - if (napi_get_value_string_utf8(env, argv, tempStr.data(), tempStrsize + 1, &tempStrsize) != napi_ok) { + std::vector argvBuf(tempStrsize + 1); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &tempStrsize); + if (status != napi_ok) { HILOG_ERROR("can not get argv value"); return nullptr; } + tempStr.assign(argvBuf.data(), tempStrsize); std::string filePath = tempStr; NativeEngine *engine = reinterpret_cast(env); auto stopResult = engine->StopHeapTracking(filePath); diff --git a/js_sys_module/process/js_childprocess.cpp b/js_sys_module/process/js_childprocess.cpp index c9d4c0ee..ca7f4566 100644 --- a/js_sys_module/process/js_childprocess.cpp +++ b/js_sys_module/process/js_childprocess.cpp @@ -450,18 +450,20 @@ namespace OHOS::JsSysModule::Process { std::string ChildProcess::RequireStrValue(napi_env env, const napi_value strValue) { + std::string result = ""; size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, strValue, nullptr, 0, &bufferSize) != napi_ok) { + napi_status status = napi_get_value_string_utf8(env, strValue, nullptr, 0, &bufferSize); + if (status != napi_ok) { HILOG_ERROR("ChildProcess:: can not get strValue size"); return nullptr; } - std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, strValue, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, strValue, argvBuf.data(), argvBuf.size(), &bufferSize); + if (status != napi_ok) { HILOG_ERROR("ChildProcess:: can not get strValue value"); return nullptr; } + result.assign(argvBuf.data(), bufferSize); return result; } diff --git a/js_sys_module/process/js_process.cpp b/js_sys_module/process/js_process.cpp index 36102034..fe101e49 100644 --- a/js_sys_module/process/js_process.cpp +++ b/js_sys_module/process/js_process.cpp @@ -36,6 +36,24 @@ namespace OHOS::JsSysModule::Process { // support g_events thread_local std::string g_events = "UnHandleRejection"; + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString) + { + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, NAPI_RETURN_ZERO, &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str size"); + return false; + } + std::vector argvBuf(len + NAPI_RETURN_ONE); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str value"); + return false; + } + jsString.assign(argvBuf.data(), len); + return true; + } + napi_value Process::GetUid(napi_env env) const { napi_value result = nullptr; @@ -120,16 +138,8 @@ namespace OHOS::JsSysModule::Process { void Process::Chdir(napi_env env, napi_value args) const { - size_t prolen = 0; - if (napi_get_value_string_utf8(env, args, nullptr, 0, &prolen) != napi_ok) { - HILOG_ERROR("Process:: can not get args size"); - return; - } std::string result = ""; - result.reserve(prolen + 1); - result.resize(prolen); - if (napi_get_value_string_utf8(env, args, result.data(), prolen + 1, &prolen) != napi_ok) { - HILOG_ERROR("Process:: can not get args value"); + if (!GetStringFromJS(env, args, result)) { return; } int proerr = 0; @@ -206,16 +216,7 @@ namespace OHOS::JsSysModule::Process { void Process::On(napi_env env, napi_value str, napi_value function) { std::string result = ""; - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, str, nullptr, NAPI_RETURN_ZERO, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get str size"); - return; - } - result.reserve(bufferSize + NAPI_RETURN_ONE); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, str, result.data(), bufferSize + NAPI_RETURN_ONE, - &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get str value"); + if (!GetStringFromJS(env, str, result)) { return; } if (function == nullptr) { @@ -241,17 +242,9 @@ namespace OHOS::JsSysModule::Process { napi_value Process::Off(napi_env env, napi_value str) { - size_t bufferSize = 0; bool flag = false; - if (napi_get_value_string_utf8(env, str, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get str size"); - return nullptr; - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, str, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get str value"); + if (!GetStringFromJS(env, str, result)) { return nullptr; } std::string temp = ""; @@ -325,16 +318,8 @@ namespace OHOS::JsSysModule::Process { napi_value convertResult = nullptr; char buf[260 * NUM_OF_DATA] = { 0 }; // 260:Only numbers path String size is 260. size_t length = sizeof(buf); - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get name size"); - return nullptr; - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get name value"); + if (!GetStringFromJS(env, name, result)) { return nullptr; } std::string temp = ""; @@ -351,16 +336,8 @@ namespace OHOS::JsSysModule::Process { napi_value Process::GetUidForName(napi_env env, napi_value name) const { napi_value convertResult = nullptr; - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get name size"); - return nullptr; - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("Process:: can not get name value"); + if (!GetStringFromJS(env, name, result)) { return nullptr; } struct passwd user; @@ -469,16 +446,8 @@ namespace OHOS::JsSysModule::Process { napi_value ProcessManager::GetUidForName(napi_env env, napi_value name) const { napi_value convertResult = nullptr; - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("ProcessManager:: can not get name size"); - return nullptr; - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("ProcessManager:: can not get name value"); + if (!GetStringFromJS(env, name, result)) { return nullptr; } struct passwd user; @@ -528,16 +497,8 @@ namespace OHOS::JsSysModule::Process { napi_value ProcessManager::GetEnvironmentVar(napi_env env, napi_value name) const { - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("ProcessManager:: can not get name size"); - return nullptr; - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, name, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("ProcessManager:: can not get name value"); + if (!GetStringFromJS(env, name, result)) { return nullptr; } std::string temp = ""; diff --git a/js_sys_module/process/js_process.h b/js_sys_module/process/js_process.h index 677da6ad..65414b7f 100644 --- a/js_sys_module/process/js_process.h +++ b/js_sys_module/process/js_process.h @@ -26,6 +26,7 @@ namespace OHOS::JsSysModule::Process { using ClearRefCallback = void (*)(napi_env env); enum class PromiseRejectionEvent : uint32_t { REJECT = 0, HANDLE }; + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString); class Process { public: /** diff --git a/js_sys_module/test/test_process.cpp b/js_sys_module/test/test_process.cpp index b37b8d83..a70b704f 100644 --- a/js_sys_module/test/test_process.cpp +++ b/js_sys_module/test/test_process.cpp @@ -58,18 +58,9 @@ napi_value Method(napi_env env, napi_callback_info info) napi_value value = args[1]; std::string buffer1 = ""; - size_t bufferSize1 = 0; - napi_get_value_string_utf8(env, name, nullptr, 0, &bufferSize1); - buffer1.reserve(bufferSize1 + 1); - buffer1.resize(bufferSize1); - napi_get_value_string_utf8(env, name, buffer1.data(), bufferSize1 + 1, &bufferSize1); - + OHOS::JsSysModule::Process::GetStringFromJS(env, name, buffer1); std::string buffer2 = ""; - size_t bufferSize2 = 0; - napi_get_value_string_utf8(env, value, nullptr, 0, &bufferSize2); - buffer2.reserve(bufferSize2 + 1); - buffer2.resize(bufferSize2); - napi_get_value_string_utf8(env, value, buffer2.data(), bufferSize2 + 1, &bufferSize2); + OHOS::JsSysModule::Process::GetStringFromJS(env, value, buffer2); testStr += buffer1 + buffer2; napi_value result = nullptr; napi_get_boolean(env, true, &result); @@ -393,16 +384,8 @@ HWTEST_F(NativeEngineTest, ProcessChdirTest001, testing::ext::TestSize.Level0) napi_create_string_utf8(env, catalogue.c_str(), catalogue.length(), &temp); process.Chdir(env, temp); napi_value cwd = process.Cwd(env); - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, cwd, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("can not get str size"); - } std::string result = ""; - result.reserve(bufferSize + 1); - result.resize(bufferSize); - if (napi_get_value_string_utf8(env, cwd, result.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("can not get str value"); - } + OHOS::JsSysModule::Process::GetStringFromJS(env, cwd, result); std::string tag = ""; tag = result; bool res = false; diff --git a/js_util_module/util/js_uuid.cpp b/js_util_module/util/js_uuid.cpp index 41441b7c..7e784fbb 100644 --- a/js_util_module/util/js_uuid.cpp +++ b/js_util_module/util/js_uuid.cpp @@ -208,13 +208,14 @@ napi_value DoParseUUID(napi_env env, napi_value src) HILOG_ERROR("DoParseUUID:: can not get src size"); return nullptr; } - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); - status = napi_get_value_string_utf8(env, src, buffer.data(), bufferSize + 1, &bufferSize); + std::vector argvBuf(bufferSize + 1); + status = napi_get_value_string_utf8(env, src, argvBuf.data(), argvBuf.size(), &bufferSize); if (status != napi_ok) { HILOG_ERROR("DoParseUUID:: can not get src value"); return nullptr; } + buffer.assign(argvBuf.data(), bufferSize); + void *data = nullptr; napi_value arrayBuffer = nullptr; status = napi_create_arraybuffer(env, outLen, &data, &arrayBuffer); diff --git a/js_util_module/util/native_module_util.cpp b/js_util_module/util/native_module_util.cpp index e3db10b3..aa0c33c6 100644 --- a/js_util_module/util/native_module_util.cpp +++ b/js_util_module/util/native_module_util.cpp @@ -177,6 +177,24 @@ namespace OHOS::Util { address = nullptr; } + bool GetStringFromJS(napi_env env, napi_value argv, std::string &jsString) + { + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, argv, nullptr, 0, &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str size"); + return false; + } + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, argv, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str value"); + return false; + } + jsString.assign(argvBuf.data(), len); + return true; + } + static napi_value DealWithFormatString(napi_env env, napi_callback_info info) { size_t argc = 1; @@ -185,15 +203,7 @@ namespace OHOS::Util { napi_get_cb_info(env, info, &argc, &argv, nullptr, nullptr); std::string format = ""; - size_t formatsize = 0; - if (napi_get_value_string_utf8(env, argv, nullptr, 0, &formatsize) != napi_ok) { - HILOG_ERROR("DealWithFormatString:: can not get argv size"); - return nullptr; - } - format.reserve(formatsize + 1); - format.resize(formatsize); - if (napi_get_value_string_utf8(env, argv, format.data(), formatsize + 1, &formatsize) != napi_ok) { - HILOG_ERROR("DealWithFormatString:: can not get argv value"); + if (!GetStringFromJS(env, argv, format)) { return nullptr; } return FormatString(env, format); @@ -218,33 +228,14 @@ namespace OHOS::Util { } napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); std::string format = ""; - size_t formatsize = 0; - if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &formatsize) != napi_ok) { - HILOG_ERROR("Printf:: can not get argv[0] size"); - FreeMemory(argv); - return nullptr; - } - format.reserve(formatsize + 1); - format.resize(formatsize); - if (napi_get_value_string_utf8(env, argv[0], format.data(), formatsize + 1, &formatsize) != napi_ok) { - HILOG_ERROR("Printf:: can not get argv[0] value"); + if (!GetStringFromJS(env, argv[0], format)) { FreeMemory(argv); return nullptr; } std::vector value; for (size_t i = 1; i < argc; i++) { std::string valueString = ""; - size_t valuesize = 0; - if (napi_get_value_string_utf8(env, argv[i], nullptr, 0, &valuesize) != napi_ok) { - HILOG_ERROR("Printf:: can not get argv[i] size"); - FreeMemory(argv); - return nullptr; - } - valueString.reserve(valuesize + 1); - valueString.resize(valuesize); - if (napi_get_value_string_utf8(env, argv[i], valueString.data(), - valuesize + 1, &valuesize) != napi_ok) { - HILOG_ERROR("Printf:: can not get argv[i] value"); + if (!GetStringFromJS(env, argv[i], valueString)) { FreeMemory(argv); return nullptr; } @@ -573,16 +564,8 @@ namespace OHOS::Util { if (valuetype != napi_string) { return ThrowError(env, "Parameter error. The type of Parameter must be string."); } - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, src, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("TextEncoder:: can not get src size"); - return nullptr; - } std::string buffer = ""; - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize, '\0'); - if (napi_get_value_string_utf8(env, src, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("TextEncoder:: can not get src value"); + if (!GetStringFromJS(env, src, buffer)) { return nullptr; } orgEncoding = buffer; @@ -1596,16 +1579,8 @@ namespace OHOS::Util { napi_valuetype valuetype; NAPI_CALL(env, napi_typeof(env, argv, &valuetype)); if (valuetype == napi_string) { - size_t bufferSize = 0; - if (napi_get_value_string_utf8(env, argv, nullptr, 0, &bufferSize) != napi_ok) { - HILOG_ERROR("StringDecoder:: can not get argv size"); - return nullptr; - } std::string buffer = ""; - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); - if (napi_get_value_string_utf8(env, argv, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("StringDecoder:: can not get argv value"); + if (!GetStringFromJS(env, argv, buffer)) { return nullptr; } if (!CheckEncodingFormat(buffer)) { diff --git a/platform/default/util_helper.cpp b/platform/default/util_helper.cpp index bc3c5569..1db3e355 100644 --- a/platform/default/util_helper.cpp +++ b/platform/default/util_helper.cpp @@ -80,11 +80,19 @@ std::string ConvertToString(UChar * uchar, size_t length) void EncodeIntoChinese(napi_env env, napi_value src, std::string encoding, std::string& buffer) { std::string input = ""; - size_t inputSize = 0; - napi_get_value_string_utf8(env, src, nullptr, 0, &inputSize); // 0:buffer size - input.reserve(inputSize + 1); - input.resize(inputSize); - napi_get_value_string_utf8(env, src, input.data(), inputSize + 1, &inputSize); + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, src, nullptr, 0, &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str size"); + return; + } + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, src, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { + HILOG_ERROR("can not get str value"); + return; + } + input.assign(argvBuf.data(), len); buffer = UtilPlugin::EncodeIntoChinese(input, encoding); } diff --git a/platform/ohos/util_helper.cpp b/platform/ohos/util_helper.cpp index 5c44a0e7..57f09355 100644 --- a/platform/ohos/util_helper.cpp +++ b/platform/ohos/util_helper.cpp @@ -312,18 +312,19 @@ namespace Commonlibrary::Platform { std::u16string EncodeUtf16BE(napi_env env, napi_value src) { std::string buffer = ""; - size_t bufferSize = 0; - - if (napi_get_value_string_utf8(env, src, nullptr, 0, &bufferSize) != napi_ok) { + size_t len = 0; + napi_status status = napi_get_value_string_utf8(env, src, nullptr, 0, &len); + if (status != napi_ok) { HILOG_ERROR("TextEncoder:: can not get src size"); return u""; } - buffer.reserve(bufferSize + 1); - buffer.resize(bufferSize); - if (napi_get_value_string_utf8(env, src, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { + std::vector argvBuf(len + 1); + status = napi_get_value_string_utf8(env, src, argvBuf.data(), argvBuf.size(), &len); + if (status != napi_ok) { HILOG_ERROR("TextEncoder:: can not get src value"); return u""; } + buffer.assign(argvBuf.data(), len); std::u16string u16Str = Utf8ToUtf16BE(buffer); return u16Str; } -- Gitee