安全模式:增加校验文件失败错误返回
authorCaisking <3449750381@qq.com>
Thu, 12 Sep 2024 12:07:31 +0000 (20:07 +0800)
committerCaisking <3449750381@qq.com>
Thu, 12 Sep 2024 12:07:31 +0000 (20:07 +0800)
code/sdk/drivers/peripheral/utils/custom_resfile_check.c

index 64a720b..dc8cd5c 100644 (file)
 #include "broadcast_feature.h"
 #include "mbedtls/md5.h"
 #include "mbedtls/error.h"
+#include <stdio.h>  
+#include <stdlib.h>  
+#include <string.h>  
+
 
 #define MAX_FILE_NAME_LEN 256
 #define MAX_FILE_CHECKSUM_STR_LEN (256 + 64)
@@ -180,100 +184,90 @@ freebuf:
     return false;
 }
 
-/*
-    校验状态
-    0 未校验
-    1 校验中
-    2 校验成功
-    3 校验失败
-*/
-bool resfile_checksum_thread(void)
-{
-    uapi_dev_runtime_set_checkres_status(1);
-    printf("resfile start check\r\n");
-    char *readbuf = malloc(MAX_FILE_CHECKSUM_STR_LEN);
-    if (readbuf == NULL)
-    {
-        printf("malloc fail, skip resfile check\r\n");
-        uapi_dev_runtime_set_checkres_status(3);
-        return false;
-    }
-    char *filename = malloc(MAX_FILE_NAME_LEN);
-    if (filename == NULL)
-    {
-        free(readbuf);
-        printf("malloc fail, skip resfile check\r\n");
-        uapi_dev_runtime_set_checkres_status(3);
-        return false;
-    }
-    FILE *file = fopen(RESFILE_CHECKSUM_FILE, "rb");
-    if (file == NULL)
-    {
-        printf("checksum list file %s not exist, skip resfile check\r\n", RESFILE_CHECKSUM_FILE);
-        free(readbuf);
-        free(filename);
-        uapi_dev_runtime_set_checkres_status(3);
-        return false;
-    }
 
-    memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
-    char tmp;
-    int i = 0;
-    FILE *diff_file = fopen(CHECK_DIFFERENTER_FILE, "w");
-    if (diff_file == NULL)
-    {
-        printf("Failed to open differential file %s\r\n", CHECK_DIFFERENTER_FILE);
-        fclose(file);
-        free(readbuf);
-        free(filename);
-        uapi_dev_runtime_set_checkres_status(3);
-        return false;
-    }
+// 校验状态  
+// 0 未校验  
+// 1 校验中  
+// 2 校验成功  
+// 3 校验失败(文件不存在)  
+// 4 校验失败(校验和错误)  
 
-    while (fread(&tmp, 1, 1, file) > 0)
-    {
-        if (i >= MAX_FILE_CHECKSUM_STR_LEN - 1) // 保留一个字符用于 '\0'
-        {
-            break;
-        }
-        if (tmp == '\n')
-        {
-            readbuf[i] = '\0'; // 结束字符串
-            memset(filename, 0, MAX_FILE_NAME_LEN);
-            if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
-            {
-                printf("resfile %s is modified or deleted!\r\n", filename);
-                fprintf(diff_file, "%s\n", filename); // 写文件并换行
-            }
-            i = 0;
-            memset(readbuf, 0, MAX_FILE_CHECKSUM_STR_LEN);
-            continue;
-        }
-        else
-        {
-            readbuf[i] = tmp;
-        }
-        i++;
-    }
+// 检查内存分配  
+void* safe_malloc(size_t size) {  
+    void* ptr = malloc(size);  
+    if (!ptr) {  
+        printf("Memory allocation failed, skipping resfile check.\n");  
+    }  
+    return ptr;  
+}  
 
-    // 处理最后一行
-    if (i > 0 && i < MAX_FILE_CHECKSUM_STR_LEN)
-    {
-        readbuf[i] = '\0'; // 结束字符串
-        memset(filename, 0, MAX_FILE_NAME_LEN);
-        if (check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN) == false)
-        {
-            printf("resfile %s is modified or deleted!\r\n", filename);
-            fprintf(diff_file, "%s\n", filename); // 写文件并换行
-        }
-    }
+// 主校验函数  
+bool resfile_checksum_thread(void) {  
+    uapi_dev_runtime_set_checkres_status(1);  
+    printf("Starting resfile check...\n");  
 
-    fclose(diff_file);
-    fclose(file);
-    free(readbuf);
-    free(filename);
-    uapi_dev_runtime_set_checkres_status(2);
-    printf("resfile check done\r\n");
+    char *readbuf = safe_malloc(MAX_FILE_CHECKSUM_STR_LEN);  
+    char *filename = safe_malloc(MAX_FILE_NAME_LEN);  
+    if (!readbuf || !filename) {  
+        uapi_dev_runtime_set_checkres_status(readbuf ? 4 : 3);  
+        free(readbuf);  
+        free(filename);  
+        return false;  
+    }  
 
-    return true;
+    FILE *file = fopen(RESFILE_CHECKSUM_FILE, "rb");  
+    if (!file) {  
+        printf("Checksum list file %s does not exist, skipping resfile check.\n", RESFILE_CHECKSUM_FILE);  
+        free(readbuf);  
+        free(filename);  
+        uapi_dev_runtime_set_checkres_status(4);  
+        return false;  
+    }  
+
+    FILE *diff_file = fopen(CHECK_DIFFERENTER_FILE, "w");  
+    if (!diff_file) {  
+        printf("Failed to open differential file %s.\n", CHECK_DIFFERENTER_FILE);  
+        fclose(file);  
+        free(readbuf);  
+        free(filename);  
+        uapi_dev_runtime_set_checkres_status(3);  
+        return false;  
+    }  
+
+    int i = 0;  
+    char tmp;  
+    while (fread(&tmp, 1, 1, file) > 0) {  
+        if (tmp == '\n') {  
+            readbuf[i] = '\0'; // 结束字符串  
+
+            // 检查文件  
+            memset(filename, 0, MAX_FILE_NAME_LEN);  
+            if (!check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN)) {  
+                printf("Resfile %s is modified or deleted!\n", filename);  
+                fprintf(diff_file, "%s\n", filename); // 写文件并换行  
+            }  
+            i = 0; // 重置索引  
+        } else if (i < MAX_FILE_CHECKSUM_STR_LEN - 1) {  
+            readbuf[i++] = tmp; // 存储字符  
+        }  
+    }  
+
+    // 处理最后一行  
+    if (i > 0 && i < MAX_FILE_CHECKSUM_STR_LEN) {  
+        readbuf[i] = '\0'; // 结束字符串  
+        memset(filename, 0, MAX_FILE_NAME_LEN);  
+        if (!check_file(readbuf, i + 1, filename, MAX_FILE_NAME_LEN)) {  
+            printf("Resfile %s is modified or deleted!\n", filename);  
+            fprintf(diff_file, "%s\n", filename); // 写文件并换行  
+        }  
+    }  
+
+    fclose(diff_file);  
+    fclose(file);  
+    free(readbuf);  
+    free(filename);  
+    uapi_dev_runtime_set_checkres_status(2);  
+    printf("Resfile check done.\n");  
+
+    return true;  
 }
\ No newline at end of file