From beca010c0e306cbd8ea6a8c2d0f0648fa506a7d7 Mon Sep 17 00:00:00 2001 From: "chenglei16@huawei.com" Date: Fri, 16 May 2025 15:24:50 +0800 Subject: [PATCH 1/4] reduce memory usage Signed-off-by: wangyang187@huawei.com --- services/diffpatch/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/services/diffpatch/BUILD.gn b/services/diffpatch/BUILD.gn index 688fd7c5..4cda4c12 100644 --- a/services/diffpatch/BUILD.gn +++ b/services/diffpatch/BUILD.gn @@ -63,6 +63,7 @@ ohos_executable("diff") { deps = [ "${updater_path}/services/log:libupdaterlog", "${updater_path}/services/package:libupdaterpackage", + "${updater_path}/utils:libutils_common", ] external_deps = [ -- Gitee From 5065ee22da0348466d375e235912712405196639 Mon Sep 17 00:00:00 2001 From: wangyang Date: Fri, 16 May 2025 07:43:19 +0000 Subject: [PATCH 2/4] update services/diffpatch/BUILD.gn. reduce usage Signed-off-by: wangyang --- services/diffpatch/BUILD.gn | 73 +++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/services/diffpatch/BUILD.gn b/services/diffpatch/BUILD.gn index 4cda4c12..7b9c2182 100644 --- a/services/diffpatch/BUILD.gn +++ b/services/diffpatch/BUILD.gn @@ -1,3 +1,76 @@ +int32_t DiffAndMoveCommandFn::WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, + size_t offset, size_t patchLength, BlockSet &targetBlock) +{ + std::ifstream fin(params.GetTransferParams()->patchDatFile, std::ios::in | std::ios::binary); + if (!fin.is_open()) { + LOG(ERROR) << "open dat file failed " << params.GetTransferParams()->patchDatFile; + return static_cast(FAILED); + } + std::unique_ptr patchBuffer = std::make_unique(patchLength); + (void)memset_s(patchBuffer.get(), patchLength, 0, patchLength); + if ((!fin.seekg(static_cast(offset), std::ios::beg)) || + (!fin.read(reinterpret_cast(patchBuffer.get()), patchLength))) { + LOG(ERROR) << "read dat file failed gcount " << fin.gcount() << ", patch len " << patchLength; + fin.close(); + return static_cast(FAILED); + } + fin.close(); + return WriteDiffToBlock(params, srcBuffer, patchBuffer.get(), patchLength, targetBlock); +} + + if (params.GetTransferParams()->isUpdaterMode) { + uint8_t *patchBuffer = params.GetTransferParams()->patchDataBuffer + offset; + ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); + } else { + ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); + } + + virtual int32_t WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, + size_t offset, size_t patchLength, BlockSet &targetBlock); + + // using PkgStreamType_Read type to reduce memory usage + auto streamType = Utils::IsUpdaterMode() ? PkgStream::PKgStreamType_FileMap : PkgStream::PkgStreamType_Read; + int32_t ret = CreatePkgStream(stream, packagePath, 0, streamType); + +std::lock_guard lock(fileStreamLock_); +std::recursive_mutex fileStreamLock_; + +static int32_t ExtractPatchDatFile(Uscript::UScriptEnv &env, const UpdateBlockInfo &infos, + Hpackage::PkgManager::StreamPtr &outStream, std::string &datFile) +{ + if (env.GetPkgManager() == nullptr) { + LOG(ERROR) << "Error to get pkg manager"; + return USCRIPT_ERROR_EXECUTE; + } + + if ((!Utils::IsDirExist(UPDATER_PATH)) && (Utils::MkdirRecursive(UPDATER_PATH, S_IRWXU) != 0)) { + LOG(ERROR) << "Failed to make path"; + return USCRIPT_ERROR_EXECUTE; + } + std::string fileName = std::string(UPDATER_PATH) + "/" + infos.patchDataName; + auto ret = env.GetPkgManager()->CreatePkgStream(outStream, fileName, 0, PkgStream::PkgStreamType_Write); + if (ret != USCRIPT_SUCCESS || outStream == nullptr) { + LOG(ERROR) << "Error to create output stream"; + return USCRIPT_ERROR_EXECUTE; + } + ret = env.GetPkgManager()->ExtractFile(infos.patchDataName, outStream); + if (ret != USCRIPT_SUCCESS) { + LOG(ERROR) << "Error to extract file"; + env.GetPkgManager()->ClosePkgStream(outStream); + return USCRIPT_ERROR_EXECUTE; + } + datFile = fileName; + return USCRIPT_SUCCESS; +} + + transferParams->isUpdaterMode = Utils::IsUpdaterMode(); + int ret = transferParams->isUpdaterMode ? ExtractFileByName(env, infos.patchDataName, outStream, + transferParams->patchDataBuffer, transferParams->patchDataSize) : ExtractPatchDatFile(env, + infos, outStream, transferParams->patchDatFile); + if (ret != USCRIPT_SUCCESS) { + + + # Copyright (C) 2022 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. -- Gitee From e578e1dcd0f2699ebd2eac2826a19c2a0df142a9 Mon Sep 17 00:00:00 2001 From: "chenglei16@huawei.com" Date: Fri, 16 May 2025 16:02:43 +0800 Subject: [PATCH 3/4] reduce mem usage Signed-off-by: chenglei16@huawei.com --- services/applypatch/command_process.cpp | 28 ++++++- services/applypatch/command_process.h | 2 + services/diffpatch/BUILD.gn | 74 ------------------- .../include/applypatch/transfer_manager.h | 2 + .../pkg_algorithm/pkg_algo_deflate.cpp | 5 +- .../package/pkg_manager/pkg_managerImpl.cpp | 5 +- services/package/pkg_manager/pkg_stream.cpp | 5 ++ services/package/pkg_manager/pkg_stream.h | 1 + .../updater_binary/update_image_block.cpp | 35 ++++++++- 9 files changed, 77 insertions(+), 80 deletions(-) diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index ab5e82ff..c9aecd24 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -196,6 +196,26 @@ int32_t DiffAndMoveCommandFn::WriteDiffToBlock(const Command ¶ms, std::vecto return targetBlock.WriteDiffToBlock(params, srcBuffer, patchBuffer, patchLength, type == CommandType::IMGDIFF); } +int32_t DiffAndMoveCommandFn::WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, + size_t offset, size_t patchLength, BlockSet &targetBlock) +{ + std::ifstream fin(params.GetTransferParams()->patchDatFile, std::ios::in | std::ios::binary); + if (!fin.is_open()) { + LOG(ERROR) << "open dat file failed " << params.GetTransferParams()->patchDatFile; + return static_cast(FAILED); + } + std::unique_ptr patchBuffer = std::make_unique(patchLength); + (void)memset_s(patchBuffer.get(), patchLength, 0, patchLength); + if ((!fin.seekg(static_cast(offset), std::ios::beg)) || + (!fin.read(reinterpret_cast(patchBuffer.get()), patchLength))) { + LOG(ERROR) << "read dat file failed gcount " << fin.gcount() << ", patch len " << patchLength; + fin.close(); + return static_cast(FAILED); + } + fin.close(); + return WriteDiffToBlock(params, srcBuffer, patchBuffer.get(), patchLength, targetBlock); +} + CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) { CommandType type = params.GetCommandType(); @@ -227,8 +247,12 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); } size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); + if (params.GetTransferParams()->isUpdaterMode) { + uint8_t *patchBuffer = params.GetTransferParams()->patchDataBuffer + offset; + ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); + } else { + ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); + } } else { ret = targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; } diff --git a/services/applypatch/command_process.h b/services/applypatch/command_process.h index 42f554b9..48caa869 100644 --- a/services/applypatch/command_process.h +++ b/services/applypatch/command_process.h @@ -63,6 +63,8 @@ public: CommandResult Execute(const Command ¶ms) override; virtual int32_t WriteDiffToBlock(const Command ¶ms, std::vector &srcBuffer, uint8_t *patchBuffer, size_t patchLength, BlockSet &targetBlock); + virtual int32_t WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, + size_t offset, size_t patchLength, BlockSet &targetBlock); }; } #endif // UPDATER_COMMAND_PROCESS_H diff --git a/services/diffpatch/BUILD.gn b/services/diffpatch/BUILD.gn index 7b9c2182..688fd7c5 100644 --- a/services/diffpatch/BUILD.gn +++ b/services/diffpatch/BUILD.gn @@ -1,76 +1,3 @@ -int32_t DiffAndMoveCommandFn::WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, - size_t offset, size_t patchLength, BlockSet &targetBlock) -{ - std::ifstream fin(params.GetTransferParams()->patchDatFile, std::ios::in | std::ios::binary); - if (!fin.is_open()) { - LOG(ERROR) << "open dat file failed " << params.GetTransferParams()->patchDatFile; - return static_cast(FAILED); - } - std::unique_ptr patchBuffer = std::make_unique(patchLength); - (void)memset_s(patchBuffer.get(), patchLength, 0, patchLength); - if ((!fin.seekg(static_cast(offset), std::ios::beg)) || - (!fin.read(reinterpret_cast(patchBuffer.get()), patchLength))) { - LOG(ERROR) << "read dat file failed gcount " << fin.gcount() << ", patch len " << patchLength; - fin.close(); - return static_cast(FAILED); - } - fin.close(); - return WriteDiffToBlock(params, srcBuffer, patchBuffer.get(), patchLength, targetBlock); -} - - if (params.GetTransferParams()->isUpdaterMode) { - uint8_t *patchBuffer = params.GetTransferParams()->patchDataBuffer + offset; - ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); - } else { - ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); - } - - virtual int32_t WriteFileToBlock(const Command ¶ms, std::vector &srcBuffer, - size_t offset, size_t patchLength, BlockSet &targetBlock); - - // using PkgStreamType_Read type to reduce memory usage - auto streamType = Utils::IsUpdaterMode() ? PkgStream::PKgStreamType_FileMap : PkgStream::PkgStreamType_Read; - int32_t ret = CreatePkgStream(stream, packagePath, 0, streamType); - -std::lock_guard lock(fileStreamLock_); -std::recursive_mutex fileStreamLock_; - -static int32_t ExtractPatchDatFile(Uscript::UScriptEnv &env, const UpdateBlockInfo &infos, - Hpackage::PkgManager::StreamPtr &outStream, std::string &datFile) -{ - if (env.GetPkgManager() == nullptr) { - LOG(ERROR) << "Error to get pkg manager"; - return USCRIPT_ERROR_EXECUTE; - } - - if ((!Utils::IsDirExist(UPDATER_PATH)) && (Utils::MkdirRecursive(UPDATER_PATH, S_IRWXU) != 0)) { - LOG(ERROR) << "Failed to make path"; - return USCRIPT_ERROR_EXECUTE; - } - std::string fileName = std::string(UPDATER_PATH) + "/" + infos.patchDataName; - auto ret = env.GetPkgManager()->CreatePkgStream(outStream, fileName, 0, PkgStream::PkgStreamType_Write); - if (ret != USCRIPT_SUCCESS || outStream == nullptr) { - LOG(ERROR) << "Error to create output stream"; - return USCRIPT_ERROR_EXECUTE; - } - ret = env.GetPkgManager()->ExtractFile(infos.patchDataName, outStream); - if (ret != USCRIPT_SUCCESS) { - LOG(ERROR) << "Error to extract file"; - env.GetPkgManager()->ClosePkgStream(outStream); - return USCRIPT_ERROR_EXECUTE; - } - datFile = fileName; - return USCRIPT_SUCCESS; -} - - transferParams->isUpdaterMode = Utils::IsUpdaterMode(); - int ret = transferParams->isUpdaterMode ? ExtractFileByName(env, infos.patchDataName, outStream, - transferParams->patchDataBuffer, transferParams->patchDataSize) : ExtractPatchDatFile(env, - infos, outStream, transferParams->patchDatFile); - if (ret != USCRIPT_SUCCESS) { - - - # Copyright (C) 2022 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -136,7 +63,6 @@ ohos_executable("diff") { deps = [ "${updater_path}/services/log:libupdaterlog", "${updater_path}/services/package:libupdaterpackage", - "${updater_path}/utils:libutils_common", ] external_deps = [ diff --git a/services/include/applypatch/transfer_manager.h b/services/include/applypatch/transfer_manager.h index d67bf800..0cb77127 100644 --- a/services/include/applypatch/transfer_manager.h +++ b/services/include/applypatch/transfer_manager.h @@ -52,9 +52,11 @@ struct TransferParams { std::string freeStash; std::string retryFile; std::string devPath; + std::string patchDatFile; uint8_t *dataBuffer; size_t dataBufferSize; bool canWrite; + bool isUpdaterMode; }; class TransferManager; diff --git a/services/package/pkg_algorithm/pkg_algo_deflate.cpp b/services/package/pkg_algorithm/pkg_algo_deflate.cpp index d0763552..96be701b 100644 --- a/services/package/pkg_algorithm/pkg_algo_deflate.cpp +++ b/services/package/pkg_algorithm/pkg_algo_deflate.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ #include "pkg_algo_deflate.h" +#include #include "pkg_stream.h" #include "pkg_utils.h" #include "securec.h" @@ -23,6 +24,7 @@ constexpr uint32_t DEFLATE_IN_BUFFER_SIZE = 1024 * 64; constexpr uint32_t DEFLATE_OUT_BUFFER_SIZE = 1024 * 32; constexpr uint32_t INFLATE_IN_BUFFER_SIZE = 1024 * 1024 * 1024; constexpr uint32_t INFLATE_OUT_BUFFER_SIZE = 1024 * 1024; +constexpr uint32_t INFLATE_IN_BUFFER_SIZE_NORMAL_MODE = 10 * 1024 * 1024; int32_t PkgAlgoDeflate::DeflateData(const PkgStreamPtr outStream, z_stream &zstream, int32_t flush, PkgBuffer &outBuffer, size_t &destOffset) const @@ -235,7 +237,8 @@ int32_t PkgAlgoDeflate::InitStream(z_stream &zstream, bool zip, PkgBuffer &inBuf PKG_LOGE("fail deflateInit2"); return PKG_NOT_EXIST_ALGORITHM; } - inBuffer.length = INFLATE_IN_BUFFER_SIZE; + inBuffer.length = (access("/bin/updater", 0) == 0) ? + INFLATE_IN_BUFFER_SIZE : INFLATE_IN_BUFFER_SIZE_NORMAL_MODE; outBuffer.length = INFLATE_OUT_BUFFER_SIZE; } diff --git a/services/package/pkg_manager/pkg_managerImpl.cpp b/services/package/pkg_manager/pkg_managerImpl.cpp index b19710b1..e2d0d394 100644 --- a/services/package/pkg_manager/pkg_managerImpl.cpp +++ b/services/package/pkg_manager/pkg_managerImpl.cpp @@ -384,7 +384,10 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, std::vector< { UPDATER_INIT_RECORD; PkgStreamPtr stream = nullptr; - int32_t ret = CreatePkgStream(stream, packagePath, 0, PkgStream::PKgStreamType_FileMap); + // using PkgStreamType_Read type to reduce memory usage + auto streamType = (access("/bin/updater", 0) == 0) ? + PkgStream::PKgStreamType_FileMap : PkgStream::PkgStreamType_Read; + int32_t ret = CreatePkgStream(stream, packagePath, 0, streamType); if (ret != PKG_SUCCESS) { PKG_LOGE("Create input stream fail %s", packagePath.c_str()); UPDATER_LAST_WORD(ret, "CreatePkgStream failed"); diff --git a/services/package/pkg_manager/pkg_stream.cpp b/services/package/pkg_manager/pkg_stream.cpp index 602821ea..48a4150e 100644 --- a/services/package/pkg_manager/pkg_stream.cpp +++ b/services/package/pkg_manager/pkg_stream.cpp @@ -75,6 +75,7 @@ FileStream::~FileStream() int32_t FileStream::Read(PkgBuffer &data, size_t start, size_t needRead, size_t &readLen) { Updater::UPDATER_INIT_RECORD; + std::lock_guard lock(fileStreamLock_); if (stream_ == nullptr) { PKG_LOGE("Invalid stream"); UPDATER_LAST_WORD(PKG_INVALID_STREAM, "Invalid stream"); @@ -111,6 +112,7 @@ int32_t FileStream::Read(PkgBuffer &data, size_t start, size_t needRead, size_t int32_t FileStream::Write(const PkgBuffer &data, size_t size, size_t start) { + std::lock_guard lock(fileStreamLock_); if (streamType_ != PkgStreamType_Write) { PKG_LOGE("Invalid stream type"); return PKG_INVALID_STREAM; @@ -134,6 +136,7 @@ int32_t FileStream::Write(const PkgBuffer &data, size_t size, size_t start) size_t FileStream::GetFileLength() { + std::lock_guard lock(fileStreamLock_); if (stream_ == nullptr) { PKG_LOGE("Invalid stream"); return 0; @@ -159,6 +162,7 @@ size_t FileStream::GetFileLength() int32_t FileStream::Seek(long int offset, int whence) { + std::lock_guard lock(fileStreamLock_); if (stream_ == nullptr) { PKG_LOGE("Invalid stream"); return PKG_INVALID_STREAM; @@ -168,6 +172,7 @@ int32_t FileStream::Seek(long int offset, int whence) int32_t FileStream::Flush(size_t size) { + std::lock_guard lock(fileStreamLock_); if (stream_ == nullptr) { PKG_LOGE("Invalid stream"); return PKG_INVALID_STREAM; diff --git a/services/package/pkg_manager/pkg_stream.h b/services/package/pkg_manager/pkg_stream.h index 5b8e6166..62ce18a0 100644 --- a/services/package/pkg_manager/pkg_stream.h +++ b/services/package/pkg_manager/pkg_stream.h @@ -112,6 +112,7 @@ private: FILE *stream_; size_t fileLength_; int32_t streamType_; + std::recursive_mutex fileStreamLock_; }; class MemoryMapStream : public PkgStreamImpl { diff --git a/services/updater_binary/update_image_block.cpp b/services/updater_binary/update_image_block.cpp index 9e1c49fc..be77e45e 100644 --- a/services/updater_binary/update_image_block.cpp +++ b/services/updater_binary/update_image_block.cpp @@ -345,6 +345,34 @@ static int32_t ExtractFileByName(Uscript::UScriptEnv &env, const std::string &fi return USCRIPT_SUCCESS; } +static int32_t ExtractPatchDatFile(Uscript::UScriptEnv &env, const UpdateBlockInfo &infos, + Hpackage::PkgManager::StreamPtr &outStream, std::string &datFile) +{ + if (env.GetPkgManager() == nullptr) { + LOG(ERROR) << "Error to get pkg manager"; + return USCRIPT_ERROR_EXECUTE; + } + + if ((!Utils::IsDirExist(UPDATER_PATH)) && (Utils::MkdirRecursive(UPDATER_PATH, S_IRWXU) != 0)) { + LOG(ERROR) << "Failed to make path"; + return USCRIPT_ERROR_EXECUTE; + } + std::string fileName = std::string(UPDATER_PATH) + "/" + infos.patchDataName; + auto ret = env.GetPkgManager()->CreatePkgStream(outStream, fileName, 0, PkgStream::PkgStreamType_Write); + if (ret != USCRIPT_SUCCESS || outStream == nullptr) { + LOG(ERROR) << "Error to create output stream"; + return USCRIPT_ERROR_EXECUTE; + } + ret = env.GetPkgManager()->ExtractFile(infos.patchDataName, outStream); + if (ret != USCRIPT_SUCCESS) { + LOG(ERROR) << "Error to extract file"; + env.GetPkgManager()->ClosePkgStream(outStream); + return USCRIPT_ERROR_EXECUTE; + } + datFile = fileName; + return USCRIPT_SUCCESS; +} + static int32_t ExecuteUpdateBlock(Uscript::UScriptEnv &env, Uscript::UScriptContext &context) { UpdateBlockInfo infos {}; @@ -385,8 +413,11 @@ static int32_t ExecuteUpdateBlock(Uscript::UScriptEnv &env, Uscript::UScriptCont env.GetPkgManager()->ClosePkgStream(outStream); LOG(INFO) << "Start unpack new data thread done. Get patch data: " << infos.patchDataName; - if (ExtractFileByName(env, infos.patchDataName, outStream, - transferParams->dataBuffer, transferParams->dataBufferSize) != USCRIPT_SUCCESS) { + transferParams->isUpdaterMode = Utils::IsUpdaterMode(); + int ret = transferParams->isUpdaterMode ? ExtractFileByName(env, infos.patchDataName, outStream, + transferParams->patchDataBuffer, transferParams->patchDataSize) : ExtractPatchDatFile(env, + infos, outStream, transferParams->patchDatFile); + if (ret != USCRIPT_SUCCESS) { return USCRIPT_ERROR_EXECUTE; } -- Gitee From cc74c293cecb72679448dd2512cdc2761333b2ea Mon Sep 17 00:00:00 2001 From: "chenglei16@huawei.com" Date: Fri, 16 May 2025 16:13:58 +0800 Subject: [PATCH 4/4] reduce mem usage Signed-off-by: chenglei16@huawei.com --- services/applypatch/command_process.cpp | 2 +- services/updater_binary/update_image_block.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index c9aecd24..dba56dfb 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -248,7 +248,7 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) } size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); if (params.GetTransferParams()->isUpdaterMode) { - uint8_t *patchBuffer = params.GetTransferParams()->patchDataBuffer + offset; + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); } else { ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); diff --git a/services/updater_binary/update_image_block.cpp b/services/updater_binary/update_image_block.cpp index be77e45e..95a6048f 100644 --- a/services/updater_binary/update_image_block.cpp +++ b/services/updater_binary/update_image_block.cpp @@ -415,7 +415,7 @@ static int32_t ExecuteUpdateBlock(Uscript::UScriptEnv &env, Uscript::UScriptCont LOG(INFO) << "Start unpack new data thread done. Get patch data: " << infos.patchDataName; transferParams->isUpdaterMode = Utils::IsUpdaterMode(); int ret = transferParams->isUpdaterMode ? ExtractFileByName(env, infos.patchDataName, outStream, - transferParams->patchDataBuffer, transferParams->patchDataSize) : ExtractPatchDatFile(env, + transferParams->dataBuffer, transferParams->dataBufferSize) : ExtractPatchDatFile(env, infos, outStream, transferParams->patchDatFile); if (ret != USCRIPT_SUCCESS) { return USCRIPT_ERROR_EXECUTE; -- Gitee