From b8505347f9d40fd5da2bbaf71a3278dd59f3b7da Mon Sep 17 00:00:00 2001 From: Wang Luyao Date: Tue, 14 May 2024 21:04:18 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=E4=BF=AE=E5=A4=8D=E6=9C=AAdrop=E5=AF=BC?= =?UTF-8?q?=E8=87=B4fd=E6=9C=AA=E9=87=8A=E6=94=BE=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98&=E6=B7=BB=E5=8A=A0=E5=85=A5=E5=8F=82'\0'=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Wang Luyao Change-Id: I6ac06a226e01e2b211dae36adb3f771e48a07d73 --- interfaces/kits/js/src/common/napi/n_val.cpp | 11 +++++++---- interfaces/kits/js/src/common/napi/n_val.h | 5 +++-- .../js/src/mod_file/class_file/file_n_exporter.cpp | 4 ++-- interfaces/kits/js/src/mod_fileio/common_func.cpp | 8 ++++---- .../kits/js/src/mod_fileio/properties/read_text.cpp | 2 +- .../class_readeriterator/readeriterator_entity.h | 8 ++++++++ interfaces/kits/js/src/mod_fs/common_func.cpp | 6 +++--- .../kits/js/src/mod_fs/properties/read_lines.cpp | 2 +- .../kits/js/src/mod_fs/properties/read_text.cpp | 2 +- interfaces/kits/js/src/mod_hash/hash.cpp | 2 +- interfaces/kits/rust/include/rust_file.h | 8 ++++++++ interfaces/kits/rust/src/adapter.rs | 8 ++++++++ interfaces/kits/rust/src/ffi.rs | 7 ++++++- utils/filemgmt_libn/include/n_val.h | 4 ++-- utils/filemgmt_libn/src/n_val.cpp | 11 +++++++---- 15 files changed, 62 insertions(+), 26 deletions(-) diff --git a/interfaces/kits/js/src/common/napi/n_val.cpp b/interfaces/kits/js/src/common/napi/n_val.cpp index 5e068e708..57c310823 100644 --- a/interfaces/kits/js/src/common/napi/n_val.cpp +++ b/interfaces/kits/js/src/common/napi/n_val.cpp @@ -58,7 +58,7 @@ bool NVal::TypeIsError(bool checkErrno) const return res; } -tuple, size_t> NVal::ToUTF8String() const +tuple, size_t> NVal::ToUTF8String(bool isPath) const { size_t strLen = 0; napi_status status = napi_get_value_string_utf8(env_, val_, nullptr, -1, &strLen); @@ -69,17 +69,20 @@ tuple, size_t> NVal::ToUTF8String() const size_t bufLen = strLen + 1; unique_ptr str = make_unique(bufLen); status = napi_get_value_string_utf8(env_, val_, str.get(), bufLen, &strLen); + if (isPath && std::strlen(str.get()) < strLen) { + return { false, nullptr, 0 }; + } return make_tuple(status == napi_ok, move(str), strLen); } -tuple, size_t> NVal::ToUTF8String(string_view defaultValue) const +tuple, size_t> NVal::ToUTF8String(string_view defaultValue, bool isPath) const { if (TypeIs(napi_undefined) || TypeIs(napi_function)) { auto str = make_unique(defaultValue.size() + 1); copy(defaultValue.begin(), defaultValue.end(), str.get()); return make_tuple(true, move(str), defaultValue.size()); } - return ToUTF8String(); + return ToUTF8String(isPath); } tuple, size_t> NVal::ToUTF16String() const @@ -182,7 +185,7 @@ tuple, uint32_t> NVal::ToStringArray() napi_value result; for (uint32_t i = 0; i < size; i++) { status = napi_get_element(env_, val_, i, &result); - auto [succ, str, ignore] = NVal(env_, result).ToUTF8String(); + auto [succ, str, ignore] = NVal(env_, result).ToUTF8String(false); stringArray.push_back(string(str.get())); } return make_tuple(status == napi_ok, stringArray, size); diff --git a/interfaces/kits/js/src/common/napi/n_val.h b/interfaces/kits/js/src/common/napi/n_val.h index 89d6a4ceb..4ac1a05d5 100644 --- a/interfaces/kits/js/src/common/napi/n_val.h +++ b/interfaces/kits/js/src/common/napi/n_val.h @@ -40,8 +40,9 @@ public: bool TypeIsError(bool checkErrno = false) const; /* SHOULD ONLY BE USED FOR EXPECTED TYPE */ - std::tuple, size_t> ToUTF8String() const; - std::tuple, size_t> ToUTF8String(std::string_view defaultValue) const; + std::tuple, size_t> ToUTF8String(bool isPath = true) const; + std::tuple, size_t> ToUTF8String(std::string_view defaultValue, + bool isPath = true) const; std::tuple, size_t> ToUTF16String() const; std::tuple ToPointer() const; std::tuple ToBool() const; diff --git a/interfaces/kits/js/src/mod_file/class_file/file_n_exporter.cpp b/interfaces/kits/js/src/mod_file/class_file/file_n_exporter.cpp index c7a423489..7cca528a9 100644 --- a/interfaces/kits/js/src/mod_file/class_file/file_n_exporter.cpp +++ b/interfaces/kits/js/src/mod_file/class_file/file_n_exporter.cpp @@ -1243,8 +1243,8 @@ napi_value FileNExporter::WriteText(napi_env env, napi_callback_info info) unique_ptr uri, text, encoding; tie(succ, uri, ignore) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("uri").ToUTF8String(); - tie(succ, text, ignore) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("text").ToUTF8String(); - tie(succ, encoding, ignore) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("encoding").ToUTF8String(); + tie(succ, text, ignore) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("text").ToUTF8String(false); + tie(succ, encoding, ignore) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("encoding").ToUTF8String(false); bool append = false; tie(succ, append) = NVal(env, funcArg[NARG_POS::FIRST]).GetProp("append").ToBool(); diff --git a/interfaces/kits/js/src/mod_fileio/common_func.cpp b/interfaces/kits/js/src/mod_fileio/common_func.cpp index e62e54069..b756eff3c 100644 --- a/interfaces/kits/js/src/mod_fileio/common_func.cpp +++ b/interfaces/kits/js/src/mod_fileio/common_func.cpp @@ -219,16 +219,16 @@ static tuple, size_t> DecodeString(napi_env env, NVal j return { false, nullptr, 0 }; } if (!encoding) { - return jsStr.ToUTF8String(); + return jsStr.ToUTF8String(false); } - auto [succ, encodingBuf, ignore] = encoding.ToUTF8String("utf-8"); + auto [succ, encodingBuf, ignore] = encoding.ToUTF8String("utf-8", false); if (!succ) { return { false, nullptr, 0 }; } string_view encodingStr(encodingBuf.get()); if (encodingStr == "utf-8") { - return jsStr.ToUTF8String(); + return jsStr.ToUTF8String(false); } else if (encodingStr == "utf-16") { return jsStr.ToUTF16String(); } else { @@ -324,7 +324,7 @@ tuple, void *, int64_t, bool, int64_t> CommonFunc::GetW int64_t retLen; bool hasPos = false; int64_t retPos; - + bool succ = false; void *buf = nullptr; int64_t bufLen; diff --git a/interfaces/kits/js/src/mod_fileio/properties/read_text.cpp b/interfaces/kits/js/src/mod_fileio/properties/read_text.cpp index 9d683db79..32895ffba 100644 --- a/interfaces/kits/js/src/mod_fileio/properties/read_text.cpp +++ b/interfaces/kits/js/src/mod_fileio/properties/read_text.cpp @@ -56,7 +56,7 @@ static tuple> GetReadTextArg(nap } if (op.HasProp("encoding")) { - auto [succ, encoding, unuse] = op.GetProp("encoding").ToUTF8String("utf-8"); + auto [succ, encoding, unuse] = op.GetProp("encoding").ToUTF8String("utf-8", false); string_view encodingStr(encoding.get()); if (!succ || encodingStr != "utf-8") { return { false, position, hasLen, len, nullptr }; diff --git a/interfaces/kits/js/src/mod_fs/class_readeriterator/readeriterator_entity.h b/interfaces/kits/js/src/mod_fs/class_readeriterator/readeriterator_entity.h index ff8a2c9c7..7a2922702 100644 --- a/interfaces/kits/js/src/mod_fs/class_readeriterator/readeriterator_entity.h +++ b/interfaces/kits/js/src/mod_fs/class_readeriterator/readeriterator_entity.h @@ -17,6 +17,7 @@ #define INTERFACES_KITS_JS_SRC_MOD_FS_CLASS_READERITERATOR_ENTITY_H #include "filemgmt_libhilog.h" +#include "rust_file.h" namespace OHOS { namespace FileManagement { @@ -25,6 +26,13 @@ namespace ModuleFileIO { struct ReaderIteratorEntity { void *iterator = nullptr; int64_t offset = 0; + ~ReaderIteratorEntity() + { + if (iterator != nullptr) { + DropReaderIterator(iterator); + iterator = nullptr; + } + } }; } // namespace ModuleFileIO } // namespace FileManagement diff --git a/interfaces/kits/js/src/mod_fs/common_func.cpp b/interfaces/kits/js/src/mod_fs/common_func.cpp index c719213b1..b09b70f93 100644 --- a/interfaces/kits/js/src/mod_fs/common_func.cpp +++ b/interfaces/kits/js/src/mod_fs/common_func.cpp @@ -354,12 +354,12 @@ static tuple, size_t> DecodeString(napi_env env, NVal j return { false, nullptr, 0 }; } if (!encoding) { - return jsStr.ToUTF8String(); + return jsStr.ToUTF8String(false); } bool succ = false; unique_ptr encodingBuf = nullptr; - tie(succ, encodingBuf, ignore) = encoding.ToUTF8String("utf-8"); + tie(succ, encodingBuf, ignore) = encoding.ToUTF8String("utf-8", false); if (!succ) { HILOGE("Failed to convert encoding to UTF8"); return { false, nullptr, 0 }; @@ -367,7 +367,7 @@ static tuple, size_t> DecodeString(napi_env env, NVal j string_view encodingStr(encodingBuf.get()); if (encodingStr == "utf-8") { - return jsStr.ToUTF8String(); + return jsStr.ToUTF8String(false); } else if (encodingStr == "utf-16") { return jsStr.ToUTF16String(); } else { diff --git a/interfaces/kits/js/src/mod_fs/properties/read_lines.cpp b/interfaces/kits/js/src/mod_fs/properties/read_lines.cpp index 6141fadd7..c099e669d 100644 --- a/interfaces/kits/js/src/mod_fs/properties/read_lines.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/read_lines.cpp @@ -33,7 +33,7 @@ static int CheckOptionArg(napi_env env, napi_value argOption) { NVal option(env, argOption); if (option.HasProp("encoding")) { - auto [succ, encoding, ignore] = option.GetProp("encoding").ToUTF8String("utf-8"); + auto [succ, encoding, ignore] = option.GetProp("encoding").ToUTF8String("utf-8", false); string_view encodingStr(encoding.get()); if (!succ || encodingStr != "utf-8") { return EINVAL; diff --git a/interfaces/kits/js/src/mod_fs/properties/read_text.cpp b/interfaces/kits/js/src/mod_fs/properties/read_text.cpp index 18659d1c4..17b2dbacd 100755 --- a/interfaces/kits/js/src/mod_fs/properties/read_text.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/read_text.cpp @@ -57,7 +57,7 @@ static tuple> GetReadTextArg(na } if (op.HasProp("encoding")) { - tie(succ, encoding, ignore) = op.GetProp("encoding").ToUTF8String("utf-8"); + tie(succ, encoding, ignore) = op.GetProp("encoding").ToUTF8String("utf-8", false); string_view encodingStr(encoding.get()); if (!succ || encodingStr != "utf-8") { HILOGE("Illegal option.encoding parameter"); diff --git a/interfaces/kits/js/src/mod_hash/hash.cpp b/interfaces/kits/js/src/mod_hash/hash.cpp index 044ccab58..d3b691844 100644 --- a/interfaces/kits/js/src/mod_hash/hash.cpp +++ b/interfaces/kits/js/src/mod_hash/hash.cpp @@ -43,7 +43,7 @@ static tuple, HASH_ALGORITHM_TYPE, bool> GetHashArgs(na return { false, nullptr, HASH_ALGORITHM_TYPE_UNSUPPORTED, isPromise }; } - auto [resGetSecondArg, alg, ignore] = NVal(env, funcArg[NARG_POS::SECOND]).ToUTF8String(); + auto [resGetSecondArg, alg, ignore] = NVal(env, funcArg[NARG_POS::SECOND]).ToUTF8String(false); if (!resGetSecondArg) { HILOGE("Invalid algorithm"); NError(EINVAL).ThrowErr(env); diff --git a/interfaces/kits/rust/include/rust_file.h b/interfaces/kits/rust/include/rust_file.h index 0f3972687..0000542ef 100644 --- a/interfaces/kits/rust/include/rust_file.h +++ b/interfaces/kits/rust/include/rust_file.h @@ -70,6 +70,14 @@ typedef struct { */ void* ReaderIterator(const char* path); +/** + * @ingroup rust + * @brief Drop iterator to release fd + * @param iter pointer to reader iterator. + * @li rust_file.h:The file where the interface is located. + */ +void DropReaderIterator(void* iter); + /** * @ingroup rust * @brief Reads a line from the reader iterator. diff --git a/interfaces/kits/rust/src/adapter.rs b/interfaces/kits/rust/src/adapter.rs index 37254ebff..3ba4af850 100644 --- a/interfaces/kits/rust/src/adapter.rs +++ b/interfaces/kits/rust/src/adapter.rs @@ -91,6 +91,14 @@ pub(crate) unsafe fn reader_iterator(path: *const c_char) -> Result<*mut c_void, Ok(Box::into_raw(Box::new(reader)) as *mut c_void) } +pub(crate) unsafe fn drop_reader_iterator(iter: *mut c_void) { + if iter.is_null() { + return; + } + let reader = Box::from_raw(iter as *mut BufReader); + drop(reader); +} + pub(crate) unsafe fn next_line(iter: *mut c_void) -> Result<*mut Str, Error> { if iter.is_null() { return Err(Error::new(ErrorKind::InvalidInput, "Invalid input")); diff --git a/interfaces/kits/rust/src/ffi.rs b/interfaces/kits/rust/src/ffi.rs index d92110253..7fe59aa4d 100644 --- a/interfaces/kits/rust/src/ffi.rs +++ b/interfaces/kits/rust/src/ffi.rs @@ -14,7 +14,7 @@ */ use crate::adapter::{ - create_dir, error_control, get_parent, next_line, reader_iterator, seek, cut_file_name, + create_dir, error_control, get_parent, next_line, reader_iterator, drop_reader_iterator, seek, cut_file_name, MakeDirectionMode, SeekPos, Str, }; use libc::{c_char, c_int, c_longlong, c_void}; @@ -32,6 +32,11 @@ pub unsafe extern "C" fn ReaderIterator(path: *const c_char) -> *mut c_void { } } +#[no_mangle] +pub unsafe extern "C" fn DropReaderIterator(iter: *mut c_void) { + drop_reader_iterator(iter) +} + #[no_mangle] pub unsafe extern "C" fn NextLine(iter: *mut c_void) -> *mut Str { match next_line(iter) { diff --git a/utils/filemgmt_libn/include/n_val.h b/utils/filemgmt_libn/include/n_val.h index f721a8912..3654d7962 100644 --- a/utils/filemgmt_libn/include/n_val.h +++ b/utils/filemgmt_libn/include/n_val.h @@ -43,8 +43,8 @@ public: bool TypeIsError(bool checkErrno = false) const; /* SHOULD ONLY BE USED FOR EXPECTED TYPE */ - std::tuple, size_t> ToUTF8String() const; - std::tuple, size_t> ToUTF8String(std::string defaultValue) const; + std::tuple, size_t> ToUTF8String(bool isPath = true) const; + std::tuple, size_t> ToUTF8String(std::string defaultValue, bool isPath = true) const; std::tuple, size_t> ToUTF16String() const; std::tuple ToPointer() const; std::tuple ToBool() const; diff --git a/utils/filemgmt_libn/src/n_val.cpp b/utils/filemgmt_libn/src/n_val.cpp index 91e3f9afb..704e0a7ec 100644 --- a/utils/filemgmt_libn/src/n_val.cpp +++ b/utils/filemgmt_libn/src/n_val.cpp @@ -59,7 +59,7 @@ bool NVal::TypeIsError(bool checkErrno) const return res; } -tuple, size_t> NVal::ToUTF8String() const +tuple, size_t> NVal::ToUTF8String(bool isPath) const { size_t strLen = 0; napi_status status = napi_get_value_string_utf8(env_, val_, nullptr, -1, &strLen); @@ -73,10 +73,13 @@ tuple, size_t> NVal::ToUTF8String() const return { false, nullptr, 0 }; } status = napi_get_value_string_utf8(env_, val_, str.get(), bufLen, &strLen); + if (isPath && std::strlen(str.get()) < strLen) { + return { false, nullptr, 0 }; + } return make_tuple(status == napi_ok, move(str), strLen); } -tuple, size_t> NVal::ToUTF8String(string defaultValue) const +tuple, size_t> NVal::ToUTF8String(string defaultValue, bool isPath) const { if (TypeIs(napi_undefined) || TypeIs(napi_function)) { auto str = CreateUniquePtr(defaultValue.size() + 1); @@ -87,7 +90,7 @@ tuple, size_t> NVal::ToUTF8String(string defaultValue) str[defaultValue.size()] = '\0'; return make_tuple(true, move(str), defaultValue.size()); } - return ToUTF8String(); + return ToUTF8String(isPath); } tuple, size_t> NVal::ToUTF16String() const @@ -200,7 +203,7 @@ tuple, uint32_t> NVal::ToStringArray() napi_value result; for (uint32_t i = 0; i < size; i++) { status = napi_get_element(env_, val_, i, &result); - auto [succ, str, ignore] = NVal(env_, result).ToUTF8String(); + auto [succ, str, ignore] = NVal(env_, result).ToUTF8String(false); stringArray.push_back(string(str.get())); } return make_tuple(status == napi_ok, stringArray, size); -- Gitee