diff --git a/interfaces/kits/js/src/common/napi/n_val.cpp b/interfaces/kits/js/src/common/napi/n_val.cpp index 5e068e7088ef9db2156875ca547e74866f005035..57c3108234ea9f1e2dd98b701050e906f667113a 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 89d6a4cebbb55168f4aa44a783e5024bd79f0c70..4ac1a05d50c7c6f8edf686ec9f8e943366ddffb9 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 c7a423489b86db89d3f2ba1be4958ffa49026ecb..7cca528a90bab60dbbe1a627a9c25b279d927a57 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 e62e540690906bea57d4e5a99a0584007e6a1f26..b756eff3c464ad404f72c0daded18ddd96e9d044 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 9d683db798202071ba39f9c543a975ae1bf8114f..32895ffba11584a99c8949262a80028b64a7f2dd 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 ff8a2c9c75f3b6a1f5f66379d13b7aa4aa109208..7a29227026cbee6b00df3ab5d232aed8d398242b 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 c719213b1759cc965de3fb5c5598b7edacd4c186..b09b70f932a7a82cf2bf642bdc144d2a58dfa4ae 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 6141fadd7488ba29cf89e22e627ac54d4916fcb3..c099e669da4f5c4950024c55e032941bc0b0a620 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 18659d1c49808a1fe75f7e39fc7dd456529260a1..17b2dbacd2c14685292c66d3b3fea171faee59c4 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 044ccab58e8bd634d781ba86bd879111ca16f7f7..d3b6918448703b14909d95dd4c99cc98ccfe8f1b 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 0f39726879f79aa82a92718bd4be340510d37c6f..0000542efbda4775dce14d411830c7d1e4c9c109 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 37254ebff7313e46c959aaae6a4c45526dfdcc11..3ba4af85009b4588ebadd47583164adaff1ee3f8 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 d9211025370d412475915aad59faaa64e38a1b7d..7fe59aa4d6632c5ab10a6430feaa445140c79a7b 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 f721a8912ea7c1451f399fef128b9dbdbe026a32..3654d796256e05eaf384457b1932eca9ae233855 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 91e3f9afb2571a5c0855e0f3f49716368bc6ff8e..704e0a7ec09957463d61c1b4a0ada623df5b3108 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);