Add option to skip free space checking 06/270406/4 tizen_brotli
authorMateusz Moscicki <m.moscicki2@samsung.com>
Mon, 31 Jan 2022 11:49:30 +0000 (12:49 +0100)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Tue, 1 Feb 2022 15:51:54 +0000 (16:51 +0100)
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
ss_engine/SS_UPI.h

index 7670eacca342d6cc7a3a73338faf75c5e1e0b0ff..cead3b89f267b62225662062984e2fa01cfd0c95 100755 (executable)
@@ -29,6 +29,7 @@ Function Prototypes Mandatory
 #include<stdlib.h>
 #include<string.h>
 #include<inttypes.h>
+#include <stdbool.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <sys/statfs.h>
@@ -2189,7 +2190,7 @@ Cleanup:
        return ulResult;
 }
 
-int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS)
+int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS, bool ab_update)
 {
        int ulResult = S_SS_SUCCESS;
        uint8_t source_sha1[SHA_DIGEST_SIZE];
@@ -2203,13 +2204,15 @@ int SS_IMGVerfiyPartition(ua_dataSS_t * ua_dataSS)
                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 (!ab_update) {
+               //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) {
@@ -2224,15 +2227,24 @@ 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
+        */
+       const char *src_blk_name;
+       if (ab_update)
+               src_blk_name = ua_dataSS->parti_info->ua_blk_name_previous;
+       else
+               src_blk_name = ua_dataSS->parti_info->ua_blk_name;
+
+       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;
        }
index b1bfa231c63552178f469c052984a0100e565f4d..901fa29222dabad63f49706cbad15c16f9b42609 100755 (executable)
@@ -18,6 +18,7 @@
 
 #ifndef _SS_UPI_H_
 #define _SS_UPI_H_
+#include <stdbool.h>
 
 #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, bool ab_update);
 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 *));