From: Joel S. <jo...@jm...> - 2015-06-26 05:25:45
|
The maximum partition name length is 12 characters but nvram accepts strings of any length. This change will enforce the maximum length passed to options that take a partition name to avoid confusion. Signed-off-by: Joel Stanley <jo...@jm...> --- v2: put check in a function as suggested by Nathan src/nvram.c | 24 +++++++++++++++++++++++- src/nvram.h | 14 ++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/nvram.c b/src/nvram.c index c3f4ebc..4d968d0 100644 --- a/src/nvram.c +++ b/src/nvram.c @@ -45,6 +45,7 @@ #include <inttypes.h> #include <zlib.h> #include <endian.h> +#include <stdbool.h> #include "nvram.h" @@ -452,6 +453,16 @@ nvram_parse_partitions(struct nvram *nvram) return 0; } +bool part_name_valid(const char *name) +{ + if (strlen(name) > MAX_PART_NAME) { + err_msg("partition name maximum length is %d\n", MAX_PART_NAME); + return false; + } + + return true; +} + /** * nvram_find_fd_partition * @brief Find a particular nvram partition using a file descriptor @@ -467,6 +478,9 @@ nvram_find_fd_partition(struct nvram *nvram, char *name) int len; int found = 0; + if (part_name_valid(name)) + return -1; + if (lseek(nvram->fd, SEEK_SET, 0) == -1) { err_msg("could not seek to beginning of file %s\n", nvram->filename); return -1; @@ -1461,12 +1475,18 @@ main (int argc, char *argv[]) break; case 'd': /* dump */ dump_name = optarg; + if (!part_name_valid(dump_name)) + exit(1); break; case 'a': /* ASCII dump */ ascii_name = optarg; + if (!part_name_valid(ascii_name)) + exit(1); break; case 'z': /* dump compressed data */ - zip_name = optarg; + zip_name = optarg; + if (!part_name_valid(zip_name)) + exit(1); break; case 'n': /* nvram-file */ nvram.filename = optarg; @@ -1509,6 +1529,8 @@ main (int argc, char *argv[]) break; case 'p': /* update-config partition name */ config_pname = optarg; + if (!part_name_valid(config_pname)) + exit(1); break; case '?': exit(1); diff --git a/src/nvram.h b/src/nvram.h index b4961fe..b78e793 100644 --- a/src/nvram.h +++ b/src/nvram.h @@ -45,14 +45,20 @@ #define MAX_CPUS 128 /** + * @def MAX_PART_NAME + * @brief maximum number of bytes in partition name + */ +#define MAX_PART_NAME 12 + +/** * @struct partition_header * @brief nvram partition header data */ struct partition_header { - unsigned char signature; /**< partition signature */ - unsigned char checksum; /**< partition checksum */ - unsigned short length; /**< partition length */ - char name[12]; /**< partition name */ + unsigned char signature; /**< partition signature */ + unsigned char checksum; /**< partition checksum */ + unsigned short length; /**< partition length */ + char name[MAX_PART_NAME]; /**< partition name */ }; /* sub-header for error-log partitions */ -- 2.1.4 |