nvramtool: plug some memory leaks

Change-Id: I8f672b872862d3448ccd2cf28fd3c05b0108ff8b
Found-by: Coverity Scan
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: http://review.coreboot.org/6561
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/util/nvramtool/cmos_lowlevel.c b/util/nvramtool/cmos_lowlevel.c
index ef0c383..618e8d2 100644
--- a/util/nvramtool/cmos_lowlevel.c
+++ b/util/nvramtool/cmos_lowlevel.c
@@ -125,13 +125,16 @@
 	result = 0;
 
 	if (e->config == CMOS_ENTRY_STRING) {
-		char *newstring = calloc(1, (length + 7) / 8);
+		int strsz = (length + 7) / 8;
+		char *newstring = alloca(strsz);
 		unsigned usize = (8 * sizeof(unsigned long long));
 
 		if (!newstring) {
 			out_of_memory();
 		}
 
+		memset(newstring, 0, strsz);
+
 		for (next_bit = 0, bits_left = length;
 		     bits_left; next_bit += nr_bits, bits_left -= nr_bits) {
 			nr_bits = cmos_bit_op_strategy(bit + next_bit,
diff --git a/util/nvramtool/cmos_ops.c b/util/nvramtool/cmos_ops.c
index 91c9f45..cb6c379 100644
--- a/util/nvramtool/cmos_ops.c
+++ b/util/nvramtool/cmos_ops.c
@@ -95,7 +95,7 @@
 	const cmos_enum_t *q;
 	unsigned long long out;
 	const char *p;
-	char *memory;
+	char *memory = NULL;
 	int negative, result, found_one;
 
 	if ((result = prepare_cmos_op_common(e)) != OK)
@@ -155,8 +155,10 @@
 		BUG();
 	}
 
-	if ((e->length < (8 * sizeof(*value))) && (out >= (1ull << e->length)))
+	if ((e->length < (8 * sizeof(*value))) && (out >= (1ull << e->length))) {
+		if (memory) free(memory);
 		return CMOS_OP_VALUE_TOO_WIDE;
+	}
 
 	*value = out;
 	return OK;