1fb299fa2Sopenharmony_ci/* 2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at 6fb299fa2Sopenharmony_ci * 7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb299fa2Sopenharmony_ci * 9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and 13fb299fa2Sopenharmony_ci * limitations under the License. 14fb299fa2Sopenharmony_ci */ 15fb299fa2Sopenharmony_ci#include "package/package.h" 16fb299fa2Sopenharmony_ci#include <cstdio> 17fb299fa2Sopenharmony_ci#include <cstdlib> 18fb299fa2Sopenharmony_ci#include <iostream> 19fb299fa2Sopenharmony_ci#include <memory> 20fb299fa2Sopenharmony_ci#include "log/log.h" 21fb299fa2Sopenharmony_ci#include "package/pkg_manager.h" 22fb299fa2Sopenharmony_ci#include "securec.h" 23fb299fa2Sopenharmony_ci 24fb299fa2Sopenharmony_ciusing namespace Updater; 25fb299fa2Sopenharmony_ciusing namespace Hpackage; 26fb299fa2Sopenharmony_ciconstexpr uint32_t VERIFY_FINSH_PERCENT = 100; 27fb299fa2Sopenharmony_ciconstexpr uint32_t MAX_ENTRY_COUNT = 4096; 28fb299fa2Sopenharmony_ci 29fb299fa2Sopenharmony_cinamespace { 30fb299fa2Sopenharmony_ciint32_t GetUpgradePkgInfo(UpgradePkgInfo *upgradePackageInfo, 31fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, ComponentInfo>> &files, 32fb299fa2Sopenharmony_ci const UpgradePkgInfoExt *pkgInfoExt, 33fb299fa2Sopenharmony_ci std::vector<ComponentInfoExt> &compInfo) 34fb299fa2Sopenharmony_ci{ 35fb299fa2Sopenharmony_ci if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) { 36fb299fa2Sopenharmony_ci LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT; 37fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 38fb299fa2Sopenharmony_ci } 39fb299fa2Sopenharmony_ci 40fb299fa2Sopenharmony_ci upgradePackageInfo->updateFileVersion = pkgInfoExt->updateFileVersion; 41fb299fa2Sopenharmony_ci if (pkgInfoExt->softwareVersion != nullptr) { 42fb299fa2Sopenharmony_ci upgradePackageInfo->softwareVersion = pkgInfoExt->softwareVersion; 43fb299fa2Sopenharmony_ci } 44fb299fa2Sopenharmony_ci if (pkgInfoExt->productUpdateId != nullptr) { 45fb299fa2Sopenharmony_ci upgradePackageInfo->productUpdateId = pkgInfoExt->productUpdateId; 46fb299fa2Sopenharmony_ci } 47fb299fa2Sopenharmony_ci if (pkgInfoExt->descriptPackageId != nullptr) { 48fb299fa2Sopenharmony_ci upgradePackageInfo->descriptPackageId = pkgInfoExt->descriptPackageId; 49fb299fa2Sopenharmony_ci } 50fb299fa2Sopenharmony_ci if (pkgInfoExt->time != nullptr) { 51fb299fa2Sopenharmony_ci upgradePackageInfo->time = pkgInfoExt->time; 52fb299fa2Sopenharmony_ci } 53fb299fa2Sopenharmony_ci if (pkgInfoExt->date != nullptr) { 54fb299fa2Sopenharmony_ci upgradePackageInfo->date = pkgInfoExt->date; 55fb299fa2Sopenharmony_ci } 56fb299fa2Sopenharmony_ci upgradePackageInfo->pkgInfo.digestMethod = pkgInfoExt->digestMethod; 57fb299fa2Sopenharmony_ci upgradePackageInfo->pkgInfo.signMethod = pkgInfoExt->signMethod; 58fb299fa2Sopenharmony_ci upgradePackageInfo->pkgInfo.entryCount = pkgInfoExt->entryCount; 59fb299fa2Sopenharmony_ci upgradePackageInfo->pkgInfo.pkgType = PKG_PACK_TYPE_UPGRADE; 60fb299fa2Sopenharmony_ci files.resize(pkgInfoExt->entryCount); 61fb299fa2Sopenharmony_ci for (uint32_t i = 0; i < pkgInfoExt->entryCount; i++) { 62fb299fa2Sopenharmony_ci files[i].first.assign(compInfo[i].filePath); 63fb299fa2Sopenharmony_ci ComponentInfo* info = &files[i].second; 64fb299fa2Sopenharmony_ci if (memcpy_s(info->digest, sizeof(info->digest), compInfo[i].digest, sizeof(info->digest)) != EOK) { 65fb299fa2Sopenharmony_ci LOG(ERROR) << "GetUpgradePkgInfo memcpy failed"; 66fb299fa2Sopenharmony_ci return PKG_NONE_MEMORY; 67fb299fa2Sopenharmony_ci } 68fb299fa2Sopenharmony_ci info->fileInfo.identity.assign(compInfo[i].componentAddr); 69fb299fa2Sopenharmony_ci info->fileInfo.unpackedSize = compInfo[i].size; 70fb299fa2Sopenharmony_ci info->fileInfo.packedSize = compInfo[i].size; 71fb299fa2Sopenharmony_ci info->fileInfo.packMethod = PKG_COMPRESS_METHOD_NONE; 72fb299fa2Sopenharmony_ci info->fileInfo.digestMethod = pkgInfoExt->digestMethod; 73fb299fa2Sopenharmony_ci info->version.assign(compInfo[i].version); 74fb299fa2Sopenharmony_ci info->id = compInfo[i].id; 75fb299fa2Sopenharmony_ci info->resType = compInfo[i].resType; 76fb299fa2Sopenharmony_ci info->type = compInfo[i].type; 77fb299fa2Sopenharmony_ci info->originalSize = compInfo[i].originalSize; 78fb299fa2Sopenharmony_ci info->compFlags = compInfo[i].flags; 79fb299fa2Sopenharmony_ci } 80fb299fa2Sopenharmony_ci return PKG_SUCCESS; 81fb299fa2Sopenharmony_ci} 82fb299fa2Sopenharmony_ci 83fb299fa2Sopenharmony_ciint32_t GetZipPkgInfo(PkgManager::PkgInfoPtr pkgInfo, 84fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, ZipFileInfo>> &files, 85fb299fa2Sopenharmony_ci const UpgradePkgInfoExt *pkgInfoExt, 86fb299fa2Sopenharmony_ci std::vector<ComponentInfoExt> &compInfo) 87fb299fa2Sopenharmony_ci{ 88fb299fa2Sopenharmony_ci if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) { 89fb299fa2Sopenharmony_ci LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT; 90fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 91fb299fa2Sopenharmony_ci } 92fb299fa2Sopenharmony_ci 93fb299fa2Sopenharmony_ci pkgInfo->signMethod = pkgInfoExt->signMethod; 94fb299fa2Sopenharmony_ci pkgInfo->digestMethod = pkgInfoExt->digestMethod; 95fb299fa2Sopenharmony_ci pkgInfo->entryCount = pkgInfoExt->entryCount; 96fb299fa2Sopenharmony_ci pkgInfo->pkgType = pkgInfoExt->pkgType; 97fb299fa2Sopenharmony_ci files.resize(pkgInfoExt->entryCount); 98fb299fa2Sopenharmony_ci for (uint32_t i = 0; i < pkgInfo->entryCount; i++) { 99fb299fa2Sopenharmony_ci files[i].first.assign(compInfo[i].filePath); 100fb299fa2Sopenharmony_ci ZipFileInfo* info = &files[i].second; 101fb299fa2Sopenharmony_ci info->fileInfo.identity.assign(compInfo[i].componentAddr); 102fb299fa2Sopenharmony_ci info->fileInfo.packMethod = PKG_COMPRESS_METHOD_ZIP; 103fb299fa2Sopenharmony_ci info->fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC; 104fb299fa2Sopenharmony_ci } 105fb299fa2Sopenharmony_ci return PKG_SUCCESS; 106fb299fa2Sopenharmony_ci} 107fb299fa2Sopenharmony_ci 108fb299fa2Sopenharmony_ciint32_t GetLz4PkgInfo(PkgManager::PkgInfoPtr pkgInfo, 109fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, Lz4FileInfo>> &files, 110fb299fa2Sopenharmony_ci const UpgradePkgInfoExt *pkgInfoExt, 111fb299fa2Sopenharmony_ci std::vector<ComponentInfoExt> &compInfo) 112fb299fa2Sopenharmony_ci{ 113fb299fa2Sopenharmony_ci if (pkgInfoExt->entryCount > MAX_ENTRY_COUNT) { 114fb299fa2Sopenharmony_ci LOG(ERROR) << "entry count oversized " << pkgInfoExt->entryCount << ", " << MAX_ENTRY_COUNT; 115fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 116fb299fa2Sopenharmony_ci } 117fb299fa2Sopenharmony_ci 118fb299fa2Sopenharmony_ci pkgInfo->signMethod = pkgInfoExt->signMethod; 119fb299fa2Sopenharmony_ci pkgInfo->digestMethod = pkgInfoExt->digestMethod; 120fb299fa2Sopenharmony_ci pkgInfo->entryCount = pkgInfoExt->entryCount; 121fb299fa2Sopenharmony_ci pkgInfo->pkgType = PKG_PACK_TYPE_LZ4; 122fb299fa2Sopenharmony_ci files.resize(pkgInfoExt->entryCount); 123fb299fa2Sopenharmony_ci for (uint32_t i = 0; i < pkgInfoExt->entryCount; i++) { 124fb299fa2Sopenharmony_ci files[i].first.assign(compInfo[i].filePath); 125fb299fa2Sopenharmony_ci Lz4FileInfo* info = &files[i].second; 126fb299fa2Sopenharmony_ci info->fileInfo.identity.assign(compInfo[i].componentAddr); 127fb299fa2Sopenharmony_ci info->fileInfo.packMethod = PKG_COMPRESS_METHOD_LZ4; 128fb299fa2Sopenharmony_ci info->fileInfo.digestMethod = PKG_DIGEST_TYPE_CRC; 129fb299fa2Sopenharmony_ci info->compressionLevel = MID_COMPRESS_LEVEL; 130fb299fa2Sopenharmony_ci info->blockSizeID = 0; 131fb299fa2Sopenharmony_ci info->contentChecksumFlag = 0; 132fb299fa2Sopenharmony_ci info->blockIndependence = 0; 133fb299fa2Sopenharmony_ci } 134fb299fa2Sopenharmony_ci return PKG_SUCCESS; 135fb299fa2Sopenharmony_ci} 136fb299fa2Sopenharmony_ci} 137fb299fa2Sopenharmony_ci 138fb299fa2Sopenharmony_ciint32_t CreatePackage(const UpgradePkgInfoExt *pkgInfoExt, 139fb299fa2Sopenharmony_ci std::vector<ComponentInfoExt> &compInfo, 140fb299fa2Sopenharmony_ci const char *path, 141fb299fa2Sopenharmony_ci const char *keyPath) 142fb299fa2Sopenharmony_ci{ 143fb299fa2Sopenharmony_ci if (pkgInfoExt == nullptr || path == nullptr || keyPath == nullptr || pkgInfoExt->entryCount > compInfo.size()) { 144fb299fa2Sopenharmony_ci LOG(ERROR) << "Check param fail "; 145fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 146fb299fa2Sopenharmony_ci } 147fb299fa2Sopenharmony_ci PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); 148fb299fa2Sopenharmony_ci if (manager == nullptr) { 149fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePackageInstance fail "; 150fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 151fb299fa2Sopenharmony_ci } 152fb299fa2Sopenharmony_ci 153fb299fa2Sopenharmony_ci int32_t ret = PKG_SUCCESS; 154fb299fa2Sopenharmony_ci switch (pkgInfoExt->pkgType) { 155fb299fa2Sopenharmony_ci case PKG_PACK_TYPE_UPGRADE: { 156fb299fa2Sopenharmony_ci UpgradePkgInfo upgradePackageInfo; 157fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, ComponentInfo>> files; 158fb299fa2Sopenharmony_ci ret = GetUpgradePkgInfo(&upgradePackageInfo, files, pkgInfoExt, compInfo); 159fb299fa2Sopenharmony_ci if (ret == PKG_SUCCESS) { 160fb299fa2Sopenharmony_ci ret = manager->CreatePackage(path, keyPath, &upgradePackageInfo.pkgInfo, files); 161fb299fa2Sopenharmony_ci } 162fb299fa2Sopenharmony_ci break; 163fb299fa2Sopenharmony_ci } 164fb299fa2Sopenharmony_ci case PKG_PACK_TYPE_ZIP: 165fb299fa2Sopenharmony_ci case PKG_PACK_TYPE_GZIP: { 166fb299fa2Sopenharmony_ci PkgInfo info; 167fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, ZipFileInfo>> files; 168fb299fa2Sopenharmony_ci ret = GetZipPkgInfo(&info, files, pkgInfoExt, compInfo); 169fb299fa2Sopenharmony_ci if (ret == PKG_SUCCESS) { 170fb299fa2Sopenharmony_ci ret = manager->CreatePackage(path, keyPath, &info, files); 171fb299fa2Sopenharmony_ci } 172fb299fa2Sopenharmony_ci break; 173fb299fa2Sopenharmony_ci } 174fb299fa2Sopenharmony_ci case PKG_PACK_TYPE_LZ4: { 175fb299fa2Sopenharmony_ci PkgInfo info; 176fb299fa2Sopenharmony_ci std::vector<std::pair<std::string, Lz4FileInfo>> files; 177fb299fa2Sopenharmony_ci ret = GetLz4PkgInfo(&info, files, pkgInfoExt, compInfo); 178fb299fa2Sopenharmony_ci if (ret == PKG_SUCCESS) { 179fb299fa2Sopenharmony_ci ret = manager->CreatePackage(path, keyPath, &info, files); 180fb299fa2Sopenharmony_ci } 181fb299fa2Sopenharmony_ci break; 182fb299fa2Sopenharmony_ci } 183fb299fa2Sopenharmony_ci default: 184fb299fa2Sopenharmony_ci ret = PKG_INVALID_PARAM; 185fb299fa2Sopenharmony_ci break; 186fb299fa2Sopenharmony_ci } 187fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 188fb299fa2Sopenharmony_ci return ret; 189fb299fa2Sopenharmony_ci} 190fb299fa2Sopenharmony_ci 191fb299fa2Sopenharmony_ciint32_t VerifyPackage(const char *packagePath, 192fb299fa2Sopenharmony_ci const char *keyPath, 193fb299fa2Sopenharmony_ci const char *version, 194fb299fa2Sopenharmony_ci const uint8_t *digest, 195fb299fa2Sopenharmony_ci size_t size) 196fb299fa2Sopenharmony_ci{ 197fb299fa2Sopenharmony_ci if (packagePath == nullptr || keyPath == nullptr || version == nullptr) { 198fb299fa2Sopenharmony_ci LOG(ERROR) << "Check param fail"; 199fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 200fb299fa2Sopenharmony_ci } 201fb299fa2Sopenharmony_ci PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); 202fb299fa2Sopenharmony_ci if (manager == nullptr) { 203fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePackageInstance fail"; 204fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 205fb299fa2Sopenharmony_ci } 206fb299fa2Sopenharmony_ci 207fb299fa2Sopenharmony_ci PkgBuffer digestBuffer(const_cast<uint8_t*>(digest), size); 208fb299fa2Sopenharmony_ci int32_t ret = manager->VerifyPackage(packagePath, keyPath, version, digestBuffer, 209fb299fa2Sopenharmony_ci [](int32_t result, uint32_t percent) {}); 210fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 211fb299fa2Sopenharmony_ci return ret; 212fb299fa2Sopenharmony_ci} 213fb299fa2Sopenharmony_ci 214fb299fa2Sopenharmony_ciint32_t VerifyPackageWithCallback(const std::string &packagePath, 215fb299fa2Sopenharmony_ci const std::string &keyPath, std::function<void(int32_t result, uint32_t percent)> cb) 216fb299fa2Sopenharmony_ci{ 217fb299fa2Sopenharmony_ci if (packagePath.empty() || keyPath.empty() || cb == nullptr) { 218fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 219fb299fa2Sopenharmony_ci } 220fb299fa2Sopenharmony_ci 221fb299fa2Sopenharmony_ci PkgManager *manager = PkgManager::CreatePackageInstance(); 222fb299fa2Sopenharmony_ci if (manager == nullptr) { 223fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePackageInstance fail"; 224fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 225fb299fa2Sopenharmony_ci } 226fb299fa2Sopenharmony_ci PkgBuffer digestBuffer {}; 227fb299fa2Sopenharmony_ci std::string version {}; 228fb299fa2Sopenharmony_ci int32_t ret = manager->VerifyPackage(packagePath, keyPath, version, digestBuffer, cb); 229fb299fa2Sopenharmony_ci if (ret != 0) { 230fb299fa2Sopenharmony_ci cb(ret, VERIFY_FINSH_PERCENT); 231fb299fa2Sopenharmony_ci } 232fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 233fb299fa2Sopenharmony_ci return ret; 234fb299fa2Sopenharmony_ci} 235fb299fa2Sopenharmony_ci 236fb299fa2Sopenharmony_ciint32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *dir, 237fb299fa2Sopenharmony_ci const char *outPath) 238fb299fa2Sopenharmony_ci{ 239fb299fa2Sopenharmony_ci if (packagePath == nullptr || outPath == nullptr) { 240fb299fa2Sopenharmony_ci LOG(ERROR) << "Check param fail "; 241fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 242fb299fa2Sopenharmony_ci } 243fb299fa2Sopenharmony_ci PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); 244fb299fa2Sopenharmony_ci if (manager == nullptr) { 245fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePackageInstance fail "; 246fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 247fb299fa2Sopenharmony_ci } 248fb299fa2Sopenharmony_ci 249fb299fa2Sopenharmony_ci std::vector<std::string> components; 250fb299fa2Sopenharmony_ci int32_t ret = manager->LoadPackageWithoutUnPack(std::string(packagePath), components); 251fb299fa2Sopenharmony_ci if (ret != PKG_SUCCESS) { 252fb299fa2Sopenharmony_ci LOG(ERROR) << "LoadPackageWithoutUnPack fail"; 253fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 254fb299fa2Sopenharmony_ci return ret; 255fb299fa2Sopenharmony_ci } 256fb299fa2Sopenharmony_ci 257fb299fa2Sopenharmony_ci for (size_t i = 0; i < components.size(); i++) { 258fb299fa2Sopenharmony_ci if (dir != nullptr && components[i].compare(0, strlen(dir), dir) != 0) { 259fb299fa2Sopenharmony_ci continue; 260fb299fa2Sopenharmony_ci } 261fb299fa2Sopenharmony_ci PkgManager::StreamPtr outStream = nullptr; 262fb299fa2Sopenharmony_ci manager->CreatePkgStream(outStream, std::string(outPath) + components[i], 0, PkgStream::PkgStreamType_Write); 263fb299fa2Sopenharmony_ci if (outStream == nullptr) { 264fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePkgStream fail"; 265fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 266fb299fa2Sopenharmony_ci return PKG_INVALID_STREAM; 267fb299fa2Sopenharmony_ci } 268fb299fa2Sopenharmony_ci manager->ExtractFile(components[i], outStream); 269fb299fa2Sopenharmony_ci manager->ClosePkgStream(outStream); 270fb299fa2Sopenharmony_ci } 271fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 272fb299fa2Sopenharmony_ci return PKG_SUCCESS; 273fb299fa2Sopenharmony_ci} 274fb299fa2Sopenharmony_ci 275fb299fa2Sopenharmony_ciint32_t ExtraPackageFile(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *file, 276fb299fa2Sopenharmony_ci const char *outPath) 277fb299fa2Sopenharmony_ci{ 278fb299fa2Sopenharmony_ci if (packagePath == nullptr || outPath == nullptr || file == nullptr) { 279fb299fa2Sopenharmony_ci LOG(ERROR) << "Check param fail "; 280fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 281fb299fa2Sopenharmony_ci } 282fb299fa2Sopenharmony_ci 283fb299fa2Sopenharmony_ci PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); 284fb299fa2Sopenharmony_ci if (manager == nullptr) { 285fb299fa2Sopenharmony_ci LOG(ERROR) << "Check param fail "; 286fb299fa2Sopenharmony_ci return PKG_INVALID_PARAM; 287fb299fa2Sopenharmony_ci } 288fb299fa2Sopenharmony_ci 289fb299fa2Sopenharmony_ci std::vector<std::string> components; 290fb299fa2Sopenharmony_ci int32_t ret = manager->LoadPackageWithoutUnPack(std::string(packagePath), components); 291fb299fa2Sopenharmony_ci if (ret != PKG_SUCCESS) { 292fb299fa2Sopenharmony_ci LOG(ERROR) << "LoadPackageWithoutUnPack fail"; 293fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 294fb299fa2Sopenharmony_ci return ret; 295fb299fa2Sopenharmony_ci } 296fb299fa2Sopenharmony_ci 297fb299fa2Sopenharmony_ci PkgManager::StreamPtr outStream = nullptr; 298fb299fa2Sopenharmony_ci manager->CreatePkgStream(outStream, std::string(outPath) + file, 0, PkgStream::PkgStreamType_Write); 299fb299fa2Sopenharmony_ci if (outStream == nullptr) { 300fb299fa2Sopenharmony_ci LOG(ERROR) << "CreatePkgStream fail"; 301fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 302fb299fa2Sopenharmony_ci return PKG_INVALID_STREAM; 303fb299fa2Sopenharmony_ci } 304fb299fa2Sopenharmony_ci manager->ExtractFile(file, outStream); 305fb299fa2Sopenharmony_ci 306fb299fa2Sopenharmony_ci manager->ClosePkgStream(outStream); 307fb299fa2Sopenharmony_ci PkgManager::ReleasePackageInstance(manager); 308fb299fa2Sopenharmony_ci return PKG_SUCCESS; 309fb299fa2Sopenharmony_ci} 310