From 1c5d9db4d1611ceb086838152daa36ee964b4b24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 25 Jun 2025 09:55:25 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E5=AE=8F=E5=85=B3=E9=97=AD=E6=B5=81?= =?UTF-8?q?=E5=BC=8F=E5=8D=87=E7=BA=A7=E5=86=85=E5=AD=98=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/applypatch/BUILD.gn | 3 +++ services/applypatch/command_process.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/services/applypatch/BUILD.gn b/services/applypatch/BUILD.gn index 31c7bb91..58b213c9 100644 --- a/services/applypatch/BUILD.gn +++ b/services/applypatch/BUILD.gn @@ -69,6 +69,9 @@ ohos_static_library("libapplypatch") { "openssl:libcrypto_static", "zlib:libz", ] + if (init_feature_ab_partition) { + defines = [ "UPDATER_AB_SUPPORT" ] + } public_configs = [ ":libapplypatch_exported_headers" ] subsystem_name = "updater" part_name = "updater" diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index 1bd5a27c..eee14d1f 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -244,12 +244,17 @@ 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); +#ifndef UPDATER_AB_SUPPORT if (Utils::IsUpdaterMode()) { uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); } else { ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); } +#else + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; + ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); +#endif } else { ret = targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; } -- Gitee From 8900a94a0ea560763e4f11ee26af54d5a3507fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 25 Jun 2025 11:19:59 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=B0=86zip=E5=A4=B4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=94=BE=E5=88=B0bin=5Fchunk=5Fupdate?= =?UTF-8?q?=E4=B8=AD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/stream_update/bin_chunk_update.cpp | 58 +++++++++++++++++++++ services/stream_update/bin_chunk_update.h | 4 ++ 2 files changed, 62 insertions(+) diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 23a5faa2..39dc9818 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -37,6 +37,10 @@ using namespace std::placeholders; constexpr const char *UPDATE_BIN_FILE = "update.bin"; constexpr const size_t HASH_BUFFER_SIZE = 50 * 1024; +constexpr uint16_t HEADER_TYPE_BYTE = 2; +constexpr uint16_t TOTAL_TL_BYTES = 6; +constexpr uint8_t ZIP_HEADER_TLV_TYPE = 0xaa; + BinChunkUpdate::BinChunkUpdate(uint32_t maxBufSize) { LOG(DEBUG) << "BinChunkUpdate::BinChunkUpdate enter"; @@ -75,6 +79,15 @@ UpdateResultCode BinChunkUpdate::StartBinChunkUpdate(const uint8_t *data, uint32 uint32_t leftLen = curlen_; LOG(DEBUG) << "BinChunkUpdate::StartBinChunkUpdate leftLen:" << leftLen; dealLen = 0; + + if (ProcessHeader(data) == STREAM_UPDATE_FAILURE) { + return STREAM_UPDATE_FAILURE; + } + + if (SkipTargetData(data, len, dealLen) == STREAM_UPDATE_SUCCESS) { + return STREAM_UPDATE_SUCCESS; + } + while (remainLen > 0) { if (!AddRemainData(data + len - remainLen, remainLen)) { LOG(ERROR) << "AddRemainData error"; @@ -100,6 +113,51 @@ UpdateResultCode BinChunkUpdate::StartBinChunkUpdate(const uint8_t *data, uint32 return ret; } +UpdateResultCode BinChunkUpdate::ProcessHeader(const uint8_t *data) +{ + if (firstBuffer) { + int type = ReadLE16(data); + LOG(INFO) << "type = " << type; + if (type != ZIP_HEADER_TLV_TYPE) { + LOG(INFO) << "Not support type " << type; + skipLength_ = 0; + firstBuffer = false; + return STREAM_UPDATE_SUCCESS; + } + firstBuffer = false; + skipLength_ = ReadLE32(data + HEADER_TYPE_BYTE) + TOTAL_TL_BYTES; + LOG(INFO) << "Skipped chunk: type=0xaa, length=" << skipLength_; + } else { + LOG(INFO) << "no need process length"; + } + return STREAM_UPDATE_SUCCESS; +} + +UpdateResultCode BinChunkUpdate::SkipTargetData(const uint8_t *data, uint32_t len, uint32_t &dealLen) +{ + if (skipLength_ <= 0) { + LOG(ERROR) << "no valid skipRemaining_ = "; + return STREAM_UPDATE_FAILURE; + } + const size_t skip = std::min(skipLength_, len); + if (skipLength_ < len) { + LOG(INFO) << "Add remain data to buffer_" << skipLength_; + if (memmove_s(buffer_, len - skipLength_, data + skipLength_, len - skipLength_) != EOK) { + LOG(ERROR) << "memmove failed"; + skipLength_ = 0; + return STREAM_UPDATE_FAILURE; + } + dealLen = skipLength_; + curlen_ = len - skipLength_; + skipLength_ = 0; + return STREAM_UPDATE_SUCCESS; + } + skipLength_ -= skip; + LOG(INFO) << "skipRemaining_ = " << skipLength_; + dealLen = len; + return STREAM_UPDATE_SUCCESS; +} + UpdateResultCode BinChunkUpdate::ProcessBufferData() { UpdateResultCode ret = STREAM_UPDATE_SUCCESS; diff --git a/services/stream_update/bin_chunk_update.h b/services/stream_update/bin_chunk_update.h index 306326d6..eb1e4699 100755 --- a/services/stream_update/bin_chunk_update.h +++ b/services/stream_update/bin_chunk_update.h @@ -93,6 +93,8 @@ private: UpdateResultCode UpdateBinData(uint8_t *data, uint32_t &len); UpdateResultCode UpdateBinHash(uint8_t *data, uint32_t &len); UpdateResultCode UpdateBinOther(uint8_t *data, uint32_t &len); + UpdateResultCode ProcessHeader(const uint8_t *data); + UpdateResultCode SkipTargetData(const uint8_t *data, uint32_t len, uint32_t &dealLen); bool AddRemainData(const uint8_t *data, uint32_t &len); bool MoveRemainingData(); @@ -135,6 +137,8 @@ private: uint32_t maxBufSize_ = 0; uint32_t curlen_ = 0; uint32_t offset_ = 0; + uint32_t skipLength_ = 0; + bool firstBuffer = true; std::map> chunkInstallProcess_; BinChunkUpdateInfo updateInfo_ {}; -- Gitee From d6ba2ff1eb531ac0f1e595560d96333e27b695fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 25 Jun 2025 14:21:35 +0800 Subject: [PATCH 3/7] fix code check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/stream_update/bin_chunk_update.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 39dc9818..f9af244c 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -133,7 +133,7 @@ UpdateResultCode BinChunkUpdate::ProcessHeader(const uint8_t *data) return STREAM_UPDATE_SUCCESS; } -UpdateResultCode BinChunkUpdate::SkipTargetData(const uint8_t *data, uint32_t len, uint32_t &dealLen) +UpdateResultCode BinChunkUpdate::SkipTargetData(const uint8_t *data, uint32_t len, uint32_t &dealLen) { if (skipLength_ <= 0) { LOG(ERROR) << "no valid skipRemaining_ = "; -- Gitee From 71d23e076c77368d20ec8cd502de71c1b2c799d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 25 Jun 2025 17:08:02 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/applypatch/command_process.cpp | 62 ++++++++++++++----------- services/applypatch/command_process.h | 2 + 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index eee14d1f..93cb3f23 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -189,6 +189,35 @@ bool LoadTarget(const Command ¶ms, size_t &pos, std::vector &buffer return true; } +int32_t DiffAndMoveCommandFn::WriteDataToBlocks(const Command ¶ms, CommandType type, + size_t pos, BlockSet &targetBlock, std::vector &buffer) +{ + if (type != CommandType::MOVE && type != CommandType::COPY) { + pos = H_MOVE_CMD_ARGS_START; + size_t offset; + if (params.IsStreamCmd()) { + offset = 0; + pos++; + } else { + offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + } + size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + +#ifndef UPDATER_AB_SUPPORT + if (Utils::IsUpdaterMode()) { + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; + return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); + } + return WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); +#else + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; + return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); +#endif + } else { + return targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; + } +} + int32_t DiffAndMoveCommandFn::WriteDiffToBlock(const Command ¶ms, std::vector &srcBuffer, uint8_t *patchBuffer, size_t patchLength, BlockSet &targetBlock) { @@ -229,39 +258,20 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) BlockSet targetBlock; std::vector buffer; CommandResult result = FAILED; - if (!LoadTarget(params, pos, buffer, targetBlock, result) || !params.GetTransferParams()->canWrite) { + if (!LoadTarget(params, pos, buffer, targetBlock, result)) { return result; } - - int32_t ret = -1; - if (type != CommandType::MOVE && type != CommandType::COPY) { - pos = H_MOVE_CMD_ARGS_START; - size_t offset; - if (params.IsStreamCmd()) { - offset = 0; - pos++; - } else { - offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); - } - size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); -#ifndef UPDATER_AB_SUPPORT - if (Utils::IsUpdaterMode()) { - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); - } else { - ret = WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); - } -#else - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); -#endif - } else { - ret = targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; + if (!params.GetTransferParams()->canWrite) { + return result; } + + int32_t ret = WriteDataToBlocks(params, type, pos, targetBlock, buffer); + if (ret != 0) { LOG(ERROR) << "fail to write block data."; return errno == EIO ? NEED_RETRY : FAILED; } + std::string storeBase = params.GetTransferParams()->storeBase; std::string freeStash = params.GetTransferParams()->freeStash; if (!freeStash.empty()) { diff --git a/services/applypatch/command_process.h b/services/applypatch/command_process.h index 48caa869..82d1682d 100644 --- a/services/applypatch/command_process.h +++ b/services/applypatch/command_process.h @@ -61,6 +61,8 @@ public: DiffAndMoveCommandFn() {} ~DiffAndMoveCommandFn() override {} CommandResult Execute(const Command ¶ms) override; + virtual int32_t WriteDataToBlocks(const Command ¶ms, CommandType type, + size_t pos, BlockSet &targetBlock, std::vector &buffer); 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, -- Gitee From b9b1755fe9699fcffb6fbfb757db56b8b3b9d127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 25 Jun 2025 17:41:52 +0800 Subject: [PATCH 5/7] fix code check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/applypatch/command_process.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index 93cb3f23..3293a288 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -266,7 +266,6 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) } int32_t ret = WriteDataToBlocks(params, type, pos, targetBlock, buffer); - if (ret != 0) { LOG(ERROR) << "fail to write block data."; return errno == EIO ? NEED_RETRY : FAILED; -- Gitee From 635718960caa9b54eff80dde05099aaca5efc3a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Thu, 26 Jun 2025 16:18:21 +0800 Subject: [PATCH 6/7] fix code check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/applypatch/command_process.cpp | 42 ++++++++++----------- services/stream_update/bin_chunk_update.cpp | 6 +-- services/stream_update/bin_chunk_update.h | 2 +- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index 3293a288..e64a9848 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -192,30 +192,29 @@ bool LoadTarget(const Command ¶ms, size_t &pos, std::vector &buffer int32_t DiffAndMoveCommandFn::WriteDataToBlocks(const Command ¶ms, CommandType type, size_t pos, BlockSet &targetBlock, std::vector &buffer) { - if (type != CommandType::MOVE && type != CommandType::COPY) { - pos = H_MOVE_CMD_ARGS_START; - size_t offset; - if (params.IsStreamCmd()) { - offset = 0; - pos++; - } else { - offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); - } - size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + if (type == CommandType::MOVE || type == CommandType::COPY) { + return targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; + } + pos = H_MOVE_CMD_ARGS_START; + size_t offset; + if (params.IsStreamCmd()) { + offset = 0; + pos++; + } else { + offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + } + size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); #ifndef UPDATER_AB_SUPPORT - if (Utils::IsUpdaterMode()) { - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); - } - return WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); -#else + if (Utils::IsUpdaterMode()) { uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); -#endif - } else { - return targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; } + return WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); +#else + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; + return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); +#endif } int32_t DiffAndMoveCommandFn::WriteDiffToBlock(const Command ¶ms, std::vector &srcBuffer, @@ -258,10 +257,7 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) BlockSet targetBlock; std::vector buffer; CommandResult result = FAILED; - if (!LoadTarget(params, pos, buffer, targetBlock, result)) { - return result; - } - if (!params.GetTransferParams()->canWrite) { + if (!LoadTarget(params, pos, buffer, targetBlock, result) || !params.GetTransferParams()->canWrite) { return result; } diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index f9af244c..7b7b8746 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -115,16 +115,16 @@ UpdateResultCode BinChunkUpdate::StartBinChunkUpdate(const uint8_t *data, uint32 UpdateResultCode BinChunkUpdate::ProcessHeader(const uint8_t *data) { - if (firstBuffer) { + if (firstBuffer_) { int type = ReadLE16(data); LOG(INFO) << "type = " << type; if (type != ZIP_HEADER_TLV_TYPE) { LOG(INFO) << "Not support type " << type; skipLength_ = 0; - firstBuffer = false; + firstBuffer_ = false; return STREAM_UPDATE_SUCCESS; } - firstBuffer = false; + firstBuffer_ = false; skipLength_ = ReadLE32(data + HEADER_TYPE_BYTE) + TOTAL_TL_BYTES; LOG(INFO) << "Skipped chunk: type=0xaa, length=" << skipLength_; } else { diff --git a/services/stream_update/bin_chunk_update.h b/services/stream_update/bin_chunk_update.h index eb1e4699..1848d078 100755 --- a/services/stream_update/bin_chunk_update.h +++ b/services/stream_update/bin_chunk_update.h @@ -138,7 +138,7 @@ private: uint32_t curlen_ = 0; uint32_t offset_ = 0; uint32_t skipLength_ = 0; - bool firstBuffer = true; + bool firstBuffer_ = true; std::map> chunkInstallProcess_; BinChunkUpdateInfo updateInfo_ {}; -- Gitee From fbfc1d303d70d08caeb7cd9438b9b906947bfc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Mon, 30 Jun 2025 11:03:21 +0800 Subject: [PATCH 7/7] =?UTF-8?q?fix=20=E6=B5=81=E5=BC=8F=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/applypatch/BUILD.gn | 3 -- services/applypatch/command_process.cpp | 50 ++++++++++--------------- services/applypatch/command_process.h | 2 - 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/services/applypatch/BUILD.gn b/services/applypatch/BUILD.gn index 58b213c9..31c7bb91 100644 --- a/services/applypatch/BUILD.gn +++ b/services/applypatch/BUILD.gn @@ -69,9 +69,6 @@ ohos_static_library("libapplypatch") { "openssl:libcrypto_static", "zlib:libz", ] - if (init_feature_ab_partition) { - defines = [ "UPDATER_AB_SUPPORT" ] - } public_configs = [ ":libapplypatch_exported_headers" ] subsystem_name = "updater" part_name = "updater" diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index e64a9848..8f555d95 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -189,34 +189,6 @@ bool LoadTarget(const Command ¶ms, size_t &pos, std::vector &buffer return true; } -int32_t DiffAndMoveCommandFn::WriteDataToBlocks(const Command ¶ms, CommandType type, - size_t pos, BlockSet &targetBlock, std::vector &buffer) -{ - if (type == CommandType::MOVE || type == CommandType::COPY) { - return targetBlock.WriteDataToBlock(params.GetTargetFileDescriptor(), buffer) == 0 ? -1 : 0; - } - pos = H_MOVE_CMD_ARGS_START; - size_t offset; - if (params.IsStreamCmd()) { - offset = 0; - pos++; - } else { - offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); - } - size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); - -#ifndef UPDATER_AB_SUPPORT - if (Utils::IsUpdaterMode()) { - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); - } - return WriteFileToBlock(params, buffer, offset, patchLength, targetBlock); -#else - uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; - return WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); -#endif -} - int32_t DiffAndMoveCommandFn::WriteDiffToBlock(const Command ¶ms, std::vector &srcBuffer, uint8_t *patchBuffer, size_t patchLength, BlockSet &targetBlock) { @@ -261,12 +233,30 @@ CommandResult DiffAndMoveCommandFn::Execute(const Command ¶ms) return result; } - int32_t ret = WriteDataToBlocks(params, type, pos, targetBlock, buffer); + int32_t ret = -1; + if (type != CommandType::MOVE && type != CommandType::COPY) { + pos = H_MOVE_CMD_ARGS_START; + size_t offset; + if (params.IsStreamCmd()) { + offset = 0; + pos++; + } else { + offset = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + } + size_t patchLength = Utils::String2Int(params.GetArgumentByPos(pos++), Utils::N_DEC); + if (Utils::IsUpdaterMode() || params.IsStreamCmd()) { + uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + 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; + } if (ret != 0) { LOG(ERROR) << "fail to write block data."; return errno == EIO ? NEED_RETRY : FAILED; } - std::string storeBase = params.GetTransferParams()->storeBase; std::string freeStash = params.GetTransferParams()->freeStash; if (!freeStash.empty()) { diff --git a/services/applypatch/command_process.h b/services/applypatch/command_process.h index 82d1682d..48caa869 100644 --- a/services/applypatch/command_process.h +++ b/services/applypatch/command_process.h @@ -61,8 +61,6 @@ public: DiffAndMoveCommandFn() {} ~DiffAndMoveCommandFn() override {} CommandResult Execute(const Command ¶ms) override; - virtual int32_t WriteDataToBlocks(const Command ¶ms, CommandType type, - size_t pos, BlockSet &targetBlock, std::vector &buffer); 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, -- Gitee