diff --git a/tools/firmware-utils/src/fw.h b/tools/firmware-utils/src/fw.h index 53a92a573c..778143d2c4 100644 --- a/tools/firmware-utils/src/fw.h +++ b/tools/firmware-utils/src/fw.h @@ -19,6 +19,7 @@ #ifndef FW_INCLUDED #define FW_INCLUDED +#include #include #define MAGIC_HEADER "OPEN" @@ -30,16 +31,16 @@ #define PART_NAME_LENGTH 16 typedef struct header { - char magic[MAGIC_LENGTH]; - char version[256]; + uint8_t magic[MAGIC_LENGTH]; + uint8_t version[256]; u_int32_t crc; u_int32_t pad; } __attribute__ ((packed)) header_t; typedef struct part { - char magic[MAGIC_LENGTH]; - char name[PART_NAME_LENGTH]; - char pad[12]; + uint8_t magic[MAGIC_LENGTH]; + uint8_t name[PART_NAME_LENGTH]; + uint8_t pad[12]; u_int32_t memaddr; u_int32_t index; u_int32_t baseaddr; @@ -54,13 +55,13 @@ typedef struct part_crc { } __attribute__ ((packed)) part_crc_t; typedef struct signature { - char magic[MAGIC_LENGTH]; + uint8_t magic[MAGIC_LENGTH]; u_int32_t crc; u_int32_t pad; } __attribute__ ((packed)) signature_t; typedef struct signature_rsa { - char magic[MAGIC_LENGTH]; + uint8_t magic[MAGIC_LENGTH]; // u_int32_t crc; unsigned char rsa_signature[256]; u_int32_t pad; diff --git a/tools/firmware-utils/src/mkfwimage.c b/tools/firmware-utils/src/mkfwimage.c index ff9011a0c4..591ce44a78 100644 --- a/tools/firmware-utils/src/mkfwimage.c +++ b/tools/firmware-utils/src/mkfwimage.c @@ -32,6 +32,7 @@ #include #include #include "fw.h" +#include "utils.h" typedef struct fw_layout_data { u_int32_t kern_start; @@ -204,21 +205,20 @@ static void write_header(void* mem, const char *magic, const char* version) header_t* header = mem; memset(header, 0, sizeof(header_t)); - memcpy(header->magic, magic, MAGIC_LENGTH); - strncpy(header->version, version, sizeof(header->version)); - header->crc = htonl(crc32(0L, (unsigned char *)header, - sizeof(header_t) - 2 * sizeof(u_int32_t))); + FW_MEMCPY_STR(header->magic, magic); + FW_MEMCPY_STR(header->version, version); + header->crc = htonl(crc32(0L, (uint8_t*) header, + sizeof(header_t) - 2 * sizeof(u_int32_t))); header->pad = 0L; } - static void write_signature(void* mem, u_int32_t sig_offset) { /* write signature */ signature_t* sign = (signature_t*)(mem + sig_offset); memset(sign, 0, sizeof(signature_t)); - memcpy(sign->magic, MAGIC_END, MAGIC_LENGTH); + FW_MEMCPY_STR(sign->magic, MAGIC_END); sign->crc = htonl(crc32(0L,(unsigned char *)mem, sig_offset)); sign->pad = 0L; } @@ -229,7 +229,7 @@ static void write_signature_rsa(void* mem, u_int32_t sig_offset) signature_rsa_t* sign = (signature_rsa_t*)(mem + sig_offset); memset(sign, 0, sizeof(signature_rsa_t)); - memcpy(sign->magic, MAGIC_ENDS, MAGIC_LENGTH); + FW_MEMCPY_STR(sign->magic, MAGIC_ENDS); // sign->crc = htonl(crc32(0L,(unsigned char *)mem, sig_offset)); sign->pad = 0L; } @@ -259,8 +259,8 @@ static int write_part(void* mem, part_data_t* d) munmap(addr, d->stats.st_size); memset(p->name, 0, PART_NAME_LENGTH); - memcpy(p->magic, MAGIC_PART, MAGIC_LENGTH); - memcpy(p->name, d->partition_name, PART_NAME_LENGTH); + FW_MEMCPY_STR(p->magic, MAGIC_PART); + FW_MEMCPY_STR(p->name, d->partition_name); p->index = htonl(d->partition_index); p->data_size = htonl(d->stats.st_size); diff --git a/tools/firmware-utils/src/utils.h b/tools/firmware-utils/src/utils.h new file mode 100644 index 0000000000..11ec740069 --- /dev/null +++ b/tools/firmware-utils/src/utils.h @@ -0,0 +1,11 @@ +#include +#include + +#pragma once + +#define FW_MEMCPY_STR(dst, src) \ + do { \ + size_t slen = strlen(src); \ + size_t dlen = sizeof(dst); \ + memcpy(dst, src, slen > dlen ? dlen : slen); \ + } while (0);