[PATCH] Patch to handle partitions with alternate names.

oklo at oklona.net oklo at oklona.net
Thu Apr 28 23:40:19 PDT 2022


Some devices, specifically Deco M4R-v3 / M5. These devices have
fallback partitions which will be used in case the device
determines that the primary partition set is unbootable.

It is believed that the backup partitions are populated by some
mechanism in the OEM firmware, meaning a fallback to
backup-partitions will effectively revert the device back to OEM software.

Signed-off-by: Ole Kristian Lona <oklo at oklona.net>
---
 src/tplink-safeloader.c | 67 +++++++++++++++++++++++++++++++++--------
 1 file changed, 54 insertions(+), 13 deletions(-)

diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
index fc46124..ccb384f 100644
--- a/src/tplink-safeloader.c
+++ b/src/tplink-safeloader.c
@@ -53,6 +53,15 @@ struct flash_partition_entry {
 	uint32_t size;
 };
 
+/** Flash partition names table entry */
+struct factory_partition_names {
+	const char *partition_table;
+	const char *soft_ver;
+	const char *os_image;
+	const char *file_system;
+	const char *extra_para;
+}; 
+
 /** Partition trailing padding definitions
  * Values 0x00 to 0xff are reserved to indicate the padding value
  * Values from 0x100 are reserved to indicate other behaviour */
@@ -89,6 +98,7 @@ struct device_info {
 	struct flash_partition_entry partitions[MAX_PARTITIONS+1];
 	const char *first_sysupgrade_partition;
 	const char *last_sysupgrade_partition;
+	struct factory_partition_names partition_names;
 };
 
 #define SOFT_VER_TEXT(_t) {.type = SOFT_VER_TYPE_TEXT, .text = _t}
@@ -2982,8 +2992,8 @@ static void set_source_date_epoch() {
 }
 
 /** Generates the partition-table partition */
-static struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) {
-	struct image_partition_entry entry = alloc_image_partition("partition-table", 0x800);
+static struct image_partition_entry make_partition_table(const char *name, const struct flash_partition_entry *p) {
+	struct image_partition_entry entry = alloc_image_partition(name, 0x800);
 
 	char *s = (char *)entry.data, *end = (char *)(s+entry.size);
 
@@ -3018,14 +3028,14 @@ static inline uint8_t bcd(uint8_t v) {
 
 
 /** Generates the soft-version partition */
-static struct image_partition_entry make_soft_version(
+static struct image_partition_entry make_soft_version(const char *name,
 	const struct device_info *info, uint32_t rev)
 {
 	/** If an info string is provided, use this instead of
 	 * the structured data, and include the null-termination */
 	if (info->soft_ver.type == SOFT_VER_TYPE_TEXT) {
 		uint32_t len = strlen(info->soft_ver.text) + 1;
-		return init_meta_partition_entry("soft-version",
+		return init_meta_partition_entry(name,
 			info->soft_ver.text, len, info->part_trail);
 	}
 
@@ -3055,11 +3065,11 @@ static struct image_partition_entry make_soft_version(
 	};
 
 	if (info->soft_ver_compat_level == 0)
-		return init_meta_partition_entry("soft-version", &s,
+		return init_meta_partition_entry(name, &s,
 			(uint8_t *)(&s.compat_level) - (uint8_t *)(&s),
 			info->part_trail);
 	else
-		return init_meta_partition_entry("soft-version", &s,
+		return init_meta_partition_entry(name, &s,
 			sizeof(s), info->part_trail);
 }
 
@@ -3298,7 +3308,7 @@ static void build_image(const char *output,
 		bool sysupgrade,
 		struct device_info *info) {
 
-	size_t i;
+	size_t i; 
 
 	struct image_partition_entry parts[7] = {};
 
@@ -3306,6 +3316,8 @@ static void build_image(const char *output,
 	struct flash_partition_entry *os_image_partition = NULL;
 	struct flash_partition_entry *file_system_partition = NULL;
 	size_t firmware_partition_index = 0;
+	char fs_name[32];
+	char os_name[32]; 
 
 	for (i = 0; info->partitions[i].name; i++) {
 		if (!strcmp(info->partitions[i].name, "firmware"))
@@ -3330,7 +3342,13 @@ static void build_image(const char *output,
 		for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
 			info->partitions[i+1] = info->partitions[i];
 
-		file_system_partition->name = "file-system";
+		if(info->partition_names.file_system==NULL)
+			file_system_partition->name = "file-system";
+		else{ 
+			strcpy(fs_name, info->partition_names.file_system);
+			file_system_partition->name = fs_name;
+		}	
+		
 		file_system_partition->base = firmware_partition->base + kernel.st_size;
 
 		/* Align partition start to erase blocks for factory images only */
@@ -3339,15 +3357,38 @@ static void build_image(const char *output,
 
 		file_system_partition->size = firmware_partition->size - file_system_partition->base;
 
-		os_image_partition->name = "os-image";
+		if(info->partition_names.os_image==NULL) 
+			os_image_partition->name = "os-image";
+		else { 
+			strcpy(os_name,info->partition_names.os_image);
+			os_image_partition->name = os_name;
+		}	
+
 		os_image_partition->size = kernel.st_size;
 	}
 
-	parts[0] = make_partition_table(info->partitions);
-	parts[1] = make_soft_version(info, rev);
+	if ( info->partition_names.partition_table==NULL)
+		parts[0] = make_partition_table("partition-table",info->partitions);
+	else
+		parts[0] = make_partition_table(info->partition_names.partition_table,info->partitions);
+	
+	if ( info->partition_names.soft_ver==NULL)
+		parts[1] = make_soft_version("soft-version",info, rev);
+	else
+		parts[1] = make_soft_version(info->partition_names.soft_ver,info, rev);
+	
 	parts[2] = make_support_list(info);
-	parts[3] = read_file("os-image", kernel_image, false, NULL);
-	parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+	
+	if ( info->partition_names.os_image==NULL)
+		parts[3] = read_file("os-image", kernel_image, false, NULL);
+	else
+		parts[3] = read_file(info->partition_names.os_image, kernel_image, false, NULL);
+
+	if ( info->partition_names.file_system==NULL)
+		parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+	else
+		parts[4] = read_file(info->partition_names.file_system, rootfs_image, add_jffs2_eof, file_system_partition);
+
 
 	/* Some devices need the extra-para partition to accept the firmware */
 	if (strcasecmp(info->id, "ARCHER-A6-V3") == 0 ||
-- 
2.32.0




More information about the openwrt-devel mailing list