Verify image before recovery 19/242119/4 submit/tizen/20200826.021413
authorKichan Kwon <k_c.kwon@samsung.com>
Mon, 24 Aug 2020 07:47:19 +0000 (16:47 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Tue, 25 Aug 2020 00:44:21 +0000 (09:44 +0900)
- Regarding img-verifier, you can refer tota-ua repository

Change-Id: Ie5b01aa092c063dae8a3a732b2c2024a13f22a64
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
src/system-recovery.c
src/system-recovery.h.in

index c91dfda5bb8933b78e402f9daa5a1fe09a5d229c..27c841e5b00ac87bdc583686d6f8c95b9c78f967 100644 (file)
@@ -10,6 +10,7 @@
 #include <sys/mount.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/wait.h>
 #include <unistd.h>
 
 #include "system-recovery.h"
@@ -101,6 +102,50 @@ static int find_recovery_image(void)
        return SUCCEED;
 }
 
+static int verify_recovery_image(void)
+{
+       int ret;
+       pid_t pid;
+       int status;
+
+       ret = access(IMAGE_VERIFIER_PATH, F_OK);
+       switch (ret) {
+       case 0:
+               break;
+       case ENOENT:
+               _W("No image verifier... Skip it");
+               return SUCCEED;
+       default:
+               _E("access for %s failed (%d)", IMAGE_VERIFIER_PATH, errno);
+               return errno;
+       }
+
+       pid = fork();
+       switch (pid) {
+       case -1:
+               _E("fork failed");
+               return EIO;
+       case 0:
+               // Child : execute image verifier
+               ret = execl(IMAGE_VERIFIER_PATH, IMAGE_VERIFIER_PATH, recovery_image_path, NULL);
+               ASSERT_RETV(ret != -1, errno, "execl for %s failed (%d)", IMAGE_VERIFIER_PATH, errno);
+               exit(ret);
+               break;
+       default:
+               // Parent : receive child's result
+               ret = wait(&status);
+               ASSERT_RETV(ret != -1, errno, "wait failed (%d)", errno);
+
+               ASSERT_RETV(WIFEXITED(status), EIO,
+                               "Image verifier doesn't terminated normally");
+               ASSERT_RETV(WEXITSTATUS(status) == SUCCEED, WEXITSTATUS(status),
+                               "Image verification failed (%d)", WEXITSTATUS(status));
+               return SUCCEED;
+       }
+
+       return EFAULT;
+}
+
 static int mount_recovery_image(void)
 {
        int ret;
@@ -265,6 +310,9 @@ int main(void)
        ret = find_recovery_image();
        ASSERT_RETV(ret == SUCCEED, ret, "Failed to find recovery image(%d)", ret);
 
+       ret = verify_recovery_image();
+       ASSERT_RETV(ret == SUCCEED, ret, "Failed to verify recovery image (%d)", ret);
+
        ret = mount_recovery_image();
        ASSERT_RETV(ret == SUCCEED, ret, "Failed to mount recovery image (%d)", ret);
 
index 22da077150879bb3244cefa13a795992fa53eaa7..8a75386211e3707926acd24ab8f558e1bc49b0be 100644 (file)
@@ -19,6 +19,8 @@ do {  \
 #define RECOVERY_IMAGE_MOUNTPOINT "/tmp/recovery_image"
 #define RECOVERY_CONFIG_FILE_PATH RECOVERY_IMAGE_MOUNTPOINT "/recovery.cfg"
 
+#define IMAGE_VERIFIER_PATH "/usr/sbin/img-verifier"
+
 #define LOG_FILE_BASENAME "last_recovery.log"
 
 #define PROGRESS_FILE_PATH "/tmp/recovery_progress"