update-manager: Run delta-verifier from delta.tar 27/287027/1
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>
Wed, 18 Jan 2023 11:11:05 +0000 (12:11 +0100)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Wed, 18 Jan 2023 16:24:02 +0000 (17:24 +0100)
Change-Id: I3fada48d9992d9af4d396482bba8340a96e66203

update-manager/fota/fota-installer.c
update-manager/fota/fota-manager.h
update-manager/fota/fota-storage-checker.c

index c94f38d1e366829532107e32b1c11bf25d7e4d9d..246cd0fccde5bf8167e44603fb140b922deec5e5 100644 (file)
@@ -6,11 +6,8 @@
 #define APP_SHARED_DIR "/opt/usr/home/owner/apps_rw"
 #define APP_SHARED_DATA "shared/data"
 
-#define FOTA_DIR "/opt/usr/data/fota"
 #define FOTA_TRIGGER_FILE "upgrade-trigger.sh"
 #define FOTA_TRIGGER_PATH FOTA_DIR "/" FOTA_TRIGGER_FILE
-#define FOTA_CHECKSUM_FILE "checksum.SHA1"
-#define FOTA_CHECKSUM_PATH FOTA_DIR "/" FOTA_CHECKSUM_FILE
 
 #define FOTA_INSTALL_REBOOT_REASON "fota"
 
@@ -81,6 +78,7 @@ int fota_installer_execute(pid_t sender_pid)
        char *appid = NULL;
        gchar *client_delta_path = NULL;
        pid_t pid;
+       bool check_sha = false;
 
        /* 1. Check client have delta.tar */
        appid = get_sender_appid(sender_pid);
@@ -99,13 +97,43 @@ int fota_installer_execute(pid_t sender_pid)
        }
        _FLOGI("Delta found: %s", client_delta_path);
 
-       /* 3. Check client have appropriate delta  */
-       ret = util_file_untar(client_delta_path, FOTA_DELTA_UPDATE_INFO_DIR, FOTA_DELTA_UPDATE_INFO_FILENAME);
+       /* 3. Prepare fota dir */
+       ret = util_file_mkdir(FOTA_DIR);
        if (ret < 0) {
                status = -1;
                goto execute_destroy;
        }
-       snprintf(buf, MAX_BUFFER_SIZE, "%s %s %s", DELTA_VERIFIER_BIN, DELTA_VERIFIER_BIN_LONG_ARG, FOTA_DELTA_UPDATE_INFO_PATH);
+
+       /* 4. Check client have appropriate delta  */
+       ret = util_file_untar(client_delta_path, FOTA_DIR, FOTA_DELTA_UPDATE_INFO_FILENAME);
+       if (ret < 0) {
+               status = -1;
+               goto execute_destroy;
+       }
+       ret = util_file_untar(client_delta_path, FOTA_DIR, DELTA_VERIFIER_BIN);
+       if (ret < 0) {
+               status = -1;
+               goto execute_destroy;
+       }
+
+       ret = util_file_untar(client_delta_path, FOTA_DIR, FOTA_CHECKSUM_FILE);
+       if (ret < 0) {
+               _FLOGW("There is no %s in delta", FOTA_CHECKSUM_FILE);
+       } else {
+               check_sha = true;
+       }
+
+       if (check_sha) {
+               if (verify_checksum(FOTA_CHECKSUM_PATH, DELTA_VERIFIER_PATH) == 0) {
+                       _FLOGI("Checksum of %s is correct", DELTA_VERIFIER_PATH);
+               } else {
+                       status = -1;
+                       _FLOGE("Failed checksum verification of %s", DELTA_VERIFIER_PATH);
+                       goto execute_destroy;
+               }
+       }
+
+       snprintf(buf, MAX_BUFFER_SIZE, "%s %s %s", DELTA_VERIFIER_BIN_PATH, DELTA_VERIFIER_BIN_LONG_ARG, FOTA_DELTA_UPDATE_INFO_PATH);
        ret = system(buf);
        if (ret < 0) {
                _FLOGE("Delta verification failed due to an error [return code: %d].", ret);
@@ -117,7 +145,7 @@ int fota_installer_execute(pid_t sender_pid)
                goto execute_destroy;
        }
 
-       /* 4. Setup local update flag */
+       /* 5. Setup local update flag */
        ret = util_file_mkdir(FOTA_STATUS_DIR);
        if (ret < 0) {
                status = -1;
@@ -130,23 +158,14 @@ int fota_installer_execute(pid_t sender_pid)
                goto execute_destroy;
        }
 
-       /* 5. Trigger update */
-       ret = util_file_mkdir(FOTA_DIR);
-       if (ret < 0) {
-               status = -1;
-               goto execute_destroy;
-       }
-
+       /* 6. Trigger update */
        ret = util_file_untar(client_delta_path, FOTA_DIR, FOTA_TRIGGER_FILE);
        if (ret < 0) {
                status = -1;
                goto execute_destroy;
        }
 
-       ret = util_file_untar(client_delta_path, FOTA_DIR, FOTA_CHECKSUM_FILE);
-       if (ret < 0) {
-               _FLOGW("There is no %s in delta", FOTA_CHECKSUM_FILE);
-       } else {
+       if (check_sha) {
                // If the checksum file exists, the sum must match
                if (verify_checksum(FOTA_CHECKSUM_PATH, FOTA_TRIGGER_PATH) == 0) {
                        _FLOGI("Checksum of %s is correct", FOTA_TRIGGER_PATH);
index 60a1fc60028018a96e7571cfec67f94d98829210..acb6a2014bb19f551465ee4faa3e2312fc9ed92c 100644 (file)
 #define FOTA_DELTA_FILENAME "delta.tar"
 #define FOTA_DELTA_COMPRESSED_FILENAME "delta.tar.gz"
 
+#define FOTA_DIR "/opt/usr/data/fota"
 #define FOTA_STATUS_DIR "/opt/data/update"
 #define FOTA_STATUS_FLAG_PATH FOTA_STATUS_DIR "/is-first-boot-after-fota"
 
-#define FOTA_DELTA_UPDATE_INFO_DIR "/tmp"
 #define FOTA_DELTA_UPDATE_INFO_FILENAME "update-info.ini"
-#define FOTA_DELTA_UPDATE_INFO_PATH FOTA_DELTA_UPDATE_INFO_DIR "/" FOTA_DELTA_UPDATE_INFO_FILENAME
-#define DELTA_VERIFIER_BIN "/usr/bin/delta-verifier"
+#define FOTA_DELTA_UPDATE_INFO_PATH FOTA_DIR "/" FOTA_DELTA_UPDATE_INFO_FILENAME
+#define DELTA_VERIFIER_BIN "delta-verifier"
+#define DELTA_VERIFIER_BIN_PATH FOTA_DIR "/" DELTA_VERIFIER_BIN
 #define DELTA_VERIFIER_BIN_LONG_ARG "--update_info_path"
+#define FOTA_CHECKSUM_FILE "checksum.SHA1"
+#define FOTA_CHECKSUM_PATH FOTA_DIR "/" FOTA_CHECKSUM_FILE
+#define DELTA_VERIFIER_PATH FOTA_DIR "/" DELTA_VERIFIER_BIN
 
 #define FOTA_EVENT_SIZE 3
 
index 9eed6a3b9d566c984bea0b57d456c0c841c22c1e..168d593e4a63e607c719dd93f1832c3f199695ce 100644 (file)
@@ -24,13 +24,32 @@ gchar *fota_storage_find_delta(const char* mount_path, const char *folder_name)
                }
        }
 
+       /* 2. Prepare fota dir */
+       ret = util_file_mkdir(FOTA_DIR);
+       if (ret < 0) {
+               goto verify_destroy;
+       }
+
        /* 2. Check storage have appropriate delta */
-       ret = util_file_untar(storage_delta_path, FOTA_DELTA_UPDATE_INFO_DIR, FOTA_DELTA_UPDATE_INFO_FILENAME);
+       ret = util_file_untar(storage_delta_path, FOTA_DIR, FOTA_DELTA_UPDATE_INFO_FILENAME);
        if (ret < 0) {
                goto verify_destroy;
        }
 
-       snprintf(buf, MAX_BUFFER_SIZE, "%s %s %s", DELTA_VERIFIER_BIN, DELTA_VERIFIER_BIN_LONG_ARG, FOTA_DELTA_UPDATE_INFO_PATH);
+       ret = util_file_untar(storage_delta_path, FOTA_DIR, FOTA_CHECKSUM_FILE);
+       if (ret < 0) {
+               _FLOGW("There is no %s in delta", FOTA_CHECKSUM_FILE);
+       } else {
+               if (verify_checksum(FOTA_CHECKSUM_PATH, DELTA_VERIFIER_PATH) == 0) {
+                       _FLOGI("Checksum of %s is correct", DELTA_VERIFIER_PATH);
+               } else {
+                       ret = -1;
+                       _FLOGE("Failed checksum verification of %s", DELTA_VERIFIER_PATH);
+                       goto verify_destroy;
+               }
+       }
+
+       snprintf(buf, MAX_BUFFER_SIZE, "%s %s %s", DELTA_VERIFIER_BIN_PATH, DELTA_VERIFIER_BIN_LONG_ARG, FOTA_DELTA_UPDATE_INFO_PATH);
        ret = system(buf);
 
        if (ret < 0) {