|
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
|