diff --git a/services/applypatch/command_process.cpp b/services/applypatch/command_process.cpp index 1bd5a27c8054d63f6fb9dc106a192ae2147f4ef4..8f555d95725d260ed028efc2866dc7d6c1a4cddd 100644 --- a/services/applypatch/command_process.cpp +++ b/services/applypatch/command_process.cpp @@ -244,7 +244,7 @@ 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); - if (Utils::IsUpdaterMode()) { + if (Utils::IsUpdaterMode() || params.IsStreamCmd()) { uint8_t *patchBuffer = params.GetTransferParams()->dataBuffer + offset; ret = WriteDiffToBlock(params, buffer, patchBuffer, patchLength, targetBlock); } else { diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 23a5faa259a969543c7a9801b426b4da00f6753f..7b7b8746a5b7d02da373a853377360d4adf862d2 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 306326d693df3a368f5fb1411c0cd478c2a3a4ef..1848d078d9132a2d867020e8e8ca17eadd3fa00b 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_ {};