From 7df2990519bff101d428d24f822cecb47a0904e3 Mon Sep 17 00:00:00 2001 From: Mateusz Moscicki Date: Mon, 31 Jan 2022 12:49:30 +0100 Subject: [PATCH] Add option to skip free space checking With DELTA_IMG_AB update type data is written directly to the target partition, so there is no need to check for available space. Change-Id: Id377e850281590176e831b27e24ade6a8fcc1fd5 --- ss_engine/SS_UPI.c | 32 +++++++++++++++++++------------- ss_engine/SS_UPI.h | 3 ++- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/ss_engine/SS_UPI.c b/ss_engine/SS_UPI.c index 87e3054..5224ea6 100755 --- a/ss_engine/SS_UPI.c +++ b/ss_engine/SS_UPI.c @@ -29,6 +29,7 @@ Function Prototypes Mandatory #include #include #include +#include #include #include #include @@ -2254,7 +2255,7 @@ Cleanup: return ulResult; } -int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS) +int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS, const char *src_blk_name, bool check_free_space) { int ulResult = S_SS_SUCCESS; uint8_t source_sha1[SHA_DIGEST_SIZE]; @@ -2262,19 +2263,21 @@ int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS) uint8_t calculated_sha1[SHA_DIGEST_SIZE]; size_t free_space = 0; - if (!(ua_dataSS && ua_dataSS->update_cfg && ua_dataSS->parti_info && ua_dataSS->parti_info->ua_blk_name)) { + if (!(ua_dataSS && ua_dataSS->update_cfg && ua_dataSS->parti_info && src_blk_name)) { LOGE("Bad structure or members\n"); SS_SetUpgradeState(E_SS_BAD_PARAMS); return E_SS_FAILURE; } - //We verify twice the image size for BACKUP source, not on Partition. As Patch will be created on RAM - SS_GetAvailableFreeSpace(SS_COMMON_WORKSPACE, &free_space); - if ((free_space) < (2 * ua_dataSS->update_cfg->target_img_size)) { - LOGE("Not enough free space [%d] for twice max size [%d]\n", free_space, - (2 * ua_dataSS->update_cfg->target_img_size)); - SS_SetUpgradeState(E_SS_FSMEMORYERROR); - return E_SS_FAILURE; + if (check_free_space) { + //We verify twice the image size for BACKUP source, not on Partition. As Patch will be created on RAM + SS_GetAvailableFreeSpace(SS_COMMON_WORKSPACE, &free_space); + if ((free_space) < (2 * ua_dataSS->update_cfg->target_img_size)) { + LOGE("Not enough free space [%d] for twice max size [%d]\n", free_space, + (2 * ua_dataSS->update_cfg->target_img_size)); + SS_SetUpgradeState(E_SS_FSMEMORYERROR); + return E_SS_FAILURE; + } } if (ParseSha1(ua_dataSS->update_cfg->soure_sha1, source_sha1) != 0) { @@ -2289,15 +2292,18 @@ int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS) return E_SS_FAILURE; } - SS_CalculateFileSha(ua_dataSS->parti_info->ua_blk_name, ua_dataSS->update_cfg->soure_img_size, calculated_sha1); + /* + * If ab_update is set it means it is a DELTA_IMG_AB update, where the patch + * is applied to data directly read from a partition in the previous slot + */ + SS_CalculateFileSha(src_blk_name, ua_dataSS->update_cfg->soure_img_size, calculated_sha1); if (memcmp(calculated_sha1, source_sha1, SHA_DIGEST_SIZE) == 0) { - LOGL(LOG_SSENGINE, "SS_IMGVerfiyPartition - SHA matches with source [%s] \n", - ua_dataSS->parti_info->ua_blk_name); + LOGL(LOG_SSENGINE, "SS_IMGVerfiyPartition - SHA matches with source [%s] \n", src_blk_name); } else { // Need not compare with Target sha as once upgraded, it should NOT verify same partition again. unsigned char actualShaBuffer[41] = { 0, }; hex_digest(calculated_sha1, actualShaBuffer, SHA_DIGEST_SIZE); LOGE("SS_IMGVerfiyPartition - SHA mismatch with SRC [%s] Expected [%s] Actual [%s]\n", - ua_dataSS->parti_info->ua_blk_name, ua_dataSS->update_cfg->soure_sha1, actualShaBuffer); + src_blk_name, ua_dataSS->update_cfg->soure_sha1, actualShaBuffer); SS_SetUpgradeState(E_SS_IMGSRCCURRUPTED); ulResult = E_SS_FAILURE; } diff --git a/ss_engine/SS_UPI.h b/ss_engine/SS_UPI.h index d82c8e6..e24c2f5 100755 --- a/ss_engine/SS_UPI.h +++ b/ss_engine/SS_UPI.h @@ -18,6 +18,7 @@ #ifndef _SS_UPI_H_ #define _SS_UPI_H_ +#include #define DISPLAYRESOLUTION_SIZE 50 @@ -60,7 +61,7 @@ int SS_AppendNode(const char *ubDeltaPath, fs_params ** headparam, fs_params ** const char *new_path, const char *patchname, const char *sha1src, const char *sha1trg, int type, char *patchpath_name); extern int SS_IMGUpdatemain(ua_dataSS_t * ua_dataSS, int update_type); -extern int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS); +extern int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS, const char *src_blk_name, bool check_free_space); extern int SS_FSUpdatemain(ua_dataSS_t * ua_dataSS, int part_idx); extern int SS_FSVerifyPartition(ua_dataSS_t * ua_dataSS, int part_idx); extern int SS_UpdateDeltaIMG(ua_dataSS_t * ua_dataSS, int (*write_to_blkdev) (char *, int, int, char *)); -- 2.7.4