[PATCH] Revert "cmd: pxe: use strdup to copy config" et al

Tom Rini trini at konsulko.com
Tue Dec 13 14:37:48 CET 2022


This reverts commits
51c5c28af59c ("cmd: pxe: use strdup to copy config"),
a5dacef7380e ("cmd: pxe: support INITRD and FDT selection with FIT") and
f723c2778cf8 ("cmd: pxe: reorder kernel treatment in label_boot").

As reported by Quentin Schulz, this introduces a regression with
previously generated and working extlinux.conf files.

Cc: Neil Armstrong <neil.armstrong at linaro.org>
Cc: Patrick Delaunay <patrick.delaunay at foss.st.com>
Reported-by: Quentin Schulz <quentin.schulz at theobroma-systems.com>
Signed-off-by: Tom Rini <trini at konsulko.com>
---
 boot/pxe_utils.c    | 69 ++++++++++++++++++++-------------------------
 doc/README.pxe      |  8 ------
 include/pxe_utils.h |  2 --
 3 files changed, 30 insertions(+), 49 deletions(-)

diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c
index 272431381763..075a0f28309e 100644
--- a/boot/pxe_utils.c
+++ b/boot/pxe_utils.c
@@ -258,7 +258,6 @@ static struct pxe_label *label_create(void)
 static void label_destroy(struct pxe_label *label)
 {
 	free(label->name);
-	free(label->kernel_label);
 	free(label->kernel);
 	free(label->config);
 	free(label->append);
@@ -522,44 +521,28 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
 		return 1;
 	}
 
-	if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r",
-				NULL) < 0) {
-		printf("Skipping %s for failure retrieving kernel\n",
-		       label->name);
-		return 1;
-	}
-
-	kernel_addr = env_get("kernel_addr_r");
-	/* for FIT, append the configuration identifier */
-	if (label->config) {
-		int len = strlen(kernel_addr) + strlen(label->config) + 1;
-
-		fit_addr = malloc(len);
-		if (!fit_addr) {
-			printf("malloc fail (FIT address)\n");
-			return 1;
-		}
-		snprintf(fit_addr, len, "%s%s", kernel_addr, label->config);
-		kernel_addr = fit_addr;
-	}
-
-	/* For FIT, the label can be identical to kernel one */
-	if (label->initrd && !strcmp(label->kernel_label, label->initrd)) {
-		initrd_addr_str =  kernel_addr;
-	} else if (label->initrd) {
+	if (label->initrd) {
 		ulong size;
+
 		if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r",
 					&size) < 0) {
 			printf("Skipping %s for failure retrieving initrd\n",
 			       label->name);
-			goto cleanup;
+			return 1;
 		}
 
 		initrd_addr_str = env_get("ramdisk_addr_r");
 		size = snprintf(initrd_str, sizeof(initrd_str), "%s:%lx",
 				initrd_addr_str, size);
 		if (size >= sizeof(initrd_str))
-			goto cleanup;
+			return 1;
+	}
+
+	if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r",
+				NULL) < 0) {
+		printf("Skipping %s for failure retrieving kernel\n",
+		       label->name);
+		return 1;
 	}
 
 	if (label->ipappend & 0x1) {
@@ -589,7 +572,7 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
 			       strlen(label->append ?: ""),
 			       strlen(ip_str), strlen(mac_str),
 			       sizeof(bootargs));
-			goto cleanup;
+			return 1;
 		}
 
 		if (label->append)
@@ -604,6 +587,21 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
 		printf("append: %s\n", finalbootargs);
 	}
 
+	kernel_addr = env_get("kernel_addr_r");
+
+	/* for FIT, append the configuration identifier */
+	if (label->config) {
+		int len = strlen(kernel_addr) + strlen(label->config) + 1;
+
+		fit_addr = malloc(len);
+		if (!fit_addr) {
+			printf("malloc fail (FIT address)\n");
+			return 1;
+		}
+		snprintf(fit_addr, len, "%s%s", kernel_addr, label->config);
+		kernel_addr = fit_addr;
+	}
+
 	/*
 	 * fdt usage is optional:
 	 * It handles the following scenarios.
@@ -625,11 +623,8 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
 	 */
 	bootm_argv[3] = env_get("fdt_addr_r");
 
-	/* For FIT, the label can be identical to kernel one */
-	if (label->fdt && !strcmp(label->kernel_label, label->fdt)) {
-		bootm_argv[3] = kernel_addr;
 	/* if fdt label is defined then get fdt from server */
-	} else if (bootm_argv[3]) {
+	if (bootm_argv[3]) {
 		char *fdtfile = NULL;
 		char *fdtfilefree = NULL;
 
@@ -1170,19 +1165,15 @@ static int parse_label_kernel(char **c, struct pxe_label *label)
 	if (err < 0)
 		return err;
 
-	/* copy the kernel label to compare with FDT / INITRD when FIT is used */
-	label->kernel_label = strdup(label->kernel);
-	if (!label->kernel_label)
-		return -ENOMEM;
-
 	s = strstr(label->kernel, "#");
 	if (!s)
 		return 1;
 
-	label->config = strdup(s);
+	label->config = malloc(strlen(s) + 1);
 	if (!label->config)
 		return -ENOMEM;
 
+	strcpy(label->config, s);
 	*s = 0;
 
 	return 1;
diff --git a/doc/README.pxe b/doc/README.pxe
index 172201093d02..d14d2bdcc9b0 100644
--- a/doc/README.pxe
+++ b/doc/README.pxe
@@ -179,19 +179,11 @@ initrd <path>	    - if this label is chosen, use tftp to retrieve the initrd
 		      at <path>. it will be stored at the address indicated in
 		      the initrd_addr_r environment variable, and that address
 		      will be passed to bootm.
-		      For FIT image, the initrd can be provided with the same value than
-		      kernel, including configuration:
-		        <path>#<conf>[#<extra-conf[#...]]
-		      In this case, kernel_addr_r is passed to bootm.
 
 fdt <path>	    - if this label is chosen, use tftp to retrieve the fdt blob
 		      at <path>. it will be stored at the address indicated in
 		      the fdt_addr_r environment variable, and that address will
 		      be passed to bootm.
-		      For FIT image, the device tree can be provided with the same value
-		      than kernel, including configuration:
-		        <path>#<conf>[#<extra-conf[#...]]
-		      In this case, kernel_addr_r is passed to bootm.
 
 devicetree <path>   - if this label is chosen, use tftp to retrieve the fdt blob
 		      at <path>. it will be stored at the address indicated in
diff --git a/include/pxe_utils.h b/include/pxe_utils.h
index 1e5e8424f53f..4a73b2aace34 100644
--- a/include/pxe_utils.h
+++ b/include/pxe_utils.h
@@ -28,7 +28,6 @@
  * Create these with the 'label_create' function given below.
  *
  * name - the name of the menu as given on the 'menu label' line.
- * kernel_label - the kernel label, including FIT config if present.
  * kernel - the path to the kernel file to use for this label.
  * append - kernel command line to use when booting this label
  * initrd - path to the initrd to use for this label.
@@ -41,7 +40,6 @@ struct pxe_label {
 	char num[4];
 	char *name;
 	char *menu;
-	char *kernel_label;
 	char *kernel;
 	char *config;
 	char *append;
-- 
2.25.1



More information about the U-Boot mailing list