File MARM-sanitize-set_mirror.diff of Package efibootmgr

---
 src/efibootmgr/efibootmgr.c |   30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

--- a/src/efibootmgr/efibootmgr.c
+++ b/src/efibootmgr/efibootmgr.c
@@ -900,15 +900,14 @@ get_mirror(int which, int *below4g, int
 	rc = read_variable(name_guid, var);
 	if (rc == 0) {
 		abm = (ADDRESS_RANGE_MIRROR_VARIABLE_DATA *) var->Data;
-		if (!which && abm->mirror_version != MIRROR_VERSION) {
-			fprintf(stderr, "** Warning ** : unrecognised version for memory mirror i/f\n");
-			return 2;
-		}
 		*below4g = abm->mirror_memory_below_4gb;
 		*above4g = abm->mirror_amount_above_4gb;
 		*mirrorstatus = abm->mirror_status;
+		if (!which && abm->mirror_version != MIRROR_VERSION) {
+			rc = 2;
+		}
 	}
-	efichar_from_char(var->VariableName, name, 1024);
+	free(var);
 	return rc;
 }
 
@@ -921,31 +920,36 @@ set_mirror(int below4g, int above4g)
 	efi_variable_t *var;
 	char *name;
 
-	if ((s = get_mirror(0, &oldbelow4g, &oldabove4g, &status)) == 0) {
-		if (oldbelow4g == below4g && oldabove4g == above4g)
-			return 0;
-	} else {
-		fprintf(stderr, "** Warning ** : platform does not support memory mirror\n");
+	if ((s = get_mirror(0, &oldbelow4g, &oldabove4g, &status)) != 0) {
+		if (s == 2)
+			fprintf(stderr, "** Warning ** : unrecognised version for memory mirror i/f\n");
+		else
+			fprintf(stderr, "** Warning ** : platform does not support memory mirror\n");
 		return s;
 	}
 
+	below4g = opts.set_mirror_lo ? below4g : oldbelow4g;
+	above4g = opts.set_mirror_hi ? above4g : oldabove4g;
+	if (oldbelow4g == below4g && oldabove4g == above4g)
+		return 0;
+
 	var = malloc(sizeof(var_entry_t));
 	memset(var, 0, sizeof(efi_variable_t));
 	var->DataSize = sizeof (abm);
-	memcpy(&(var->Data), (uint8_t *)&abm, var->DataSize);
 	var->Attributes = EFI_VARIABLE_NON_VOLATILE
 		| EFI_VARIABLE_BOOTSERVICE_ACCESS
 		| EFI_VARIABLE_RUNTIME_ACCESS;
 
 	abm.mirror_version = MIRROR_VERSION;
-	abm.mirror_amount_above_4gb = opts.set_mirror_hi ? above4g : oldabove4g;
-	abm.mirror_memory_below_4gb = opts.set_mirror_lo ? below4g : oldbelow4g;
+	abm.mirror_amount_above_4gb = above4g;
+	abm.mirror_memory_below_4gb = below4g;
 	abm.mirror_status = 0;
 	memcpy(&(var->Data), (uint8_t *)&abm, var->DataSize);
 	var->VendorGuid = ADDRESS_RANGE_MIRROR_VARIABLE_GUID;
 	name = ADDRESS_RANGE_MIRROR_VARIABLE_REQUEST;
 	efichar_from_char(var->VariableName, name, 1024);
 	rc = create_or_edit_variable(var);
+	free(var);
 	return rc;
 }
 
openSUSE Build Service is sponsored by