cbfstool: free memory

Change-Id: Ic53127a61154460fa3741a92a3b2de0eba446e9f
Found-by: Coverity Scan
Signed-off-by: Patrick Georgi <patrick@georgi-clan.de>
Reviewed-on: http://review.coreboot.org/6987
Tested-by: build bot (Jenkins)
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index dabe322..38cc482 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -79,8 +79,9 @@
 	int segments = 1;
 	int isize = 0, osize = 0;
 	int doffset = 0;
-	struct cbfs_payload_segment *segs;
+	struct cbfs_payload_segment *segs = NULL;
 	int i;
+	int ret = 0;
 
 	comp_func_ptr compress = compression_function(algo);
 	if (!compress)
@@ -133,12 +134,16 @@
 	}
 	/* allocate the segment header array */
 	segs = calloc(segments, sizeof(*segs));
-	if (segs == NULL)
-		return -1;
+	if (segs == NULL) {
+		ret = -1;
+		goto out;
+	}
 	/* Allocate a block of memory to store the data in */
 	if (buffer_create(output, (segments * sizeof(*segs)) + isize,
-			  input->name) != 0)
-		return -1;
+			  input->name) != 0) {
+		ret = -1;
+		goto out;
+	}
 	memset(output->data, 0, output->size);
 
 	doffset = (segments * sizeof(*segs));
@@ -208,7 +213,8 @@
 		if (compress((char *)&header[phdr[i].p_offset],
 			     phdr[i].p_filesz, output->data + doffset, &len)) {
 			buffer_delete(output);
-			return -1;
+			ret = -1;
+			goto out;
 		}
 		segs[segments].len = len;
 
@@ -233,7 +239,12 @@
 
 	output->size = (segments * sizeof(*segs)) + osize;
 	xdr_segs(output, segs, segments);
-	return 0;
+
+out:
+	if (segs) free(segs);
+	if (shdr) free(shdr);
+	if (phdr) free(phdr);
+	return ret;
 }
 
 int parse_flat_binary_to_payload(const struct buffer *input,