From: Caisking <3449750381@qq.com> Date: Thu, 12 Sep 2024 12:07:31 +0000 (+0800) Subject: 安全模式:增加校验文件失败错误返回 X-Git-Tag: release_V1.2.70_20241020_135402~485^2~5^2~7 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=25ac5ec60afe5157fd113a67066a13469114dbc2;p=mirrors%2FFD230.git 安全模式:增加校验文件失败错误返回 --- diff --git a/code/sdk/drivers/peripheral/utils/custom_resfile_check.c b/code/sdk/drivers/peripheral/utils/custom_resfile_check.c index 64a720ba5..dc8cd5cda 100644 --- a/code/sdk/drivers/peripheral/utils/custom_resfile_check.c +++ b/code/sdk/drivers/peripheral/utils/custom_resfile_check.c @@ -35,6 +35,10 @@ #include "broadcast_feature.h" #include "mbedtls/md5.h" #include "mbedtls/error.h" +#include +#include +#include + #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