Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 May 2014 14:01:34 +0000 (UTC)
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r266124 - user/marcel/mkimg
Message-ID:  <201405151401.s4FE1YhE007990@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Thu May 15 14:01:34 2014
New Revision: 266124
URL: http://svnweb.freebsd.org/changeset/base/266124

Log:
  Check allocation errors and free memory we allocated.

Modified:
  user/marcel/mkimg/vmdk.c

Modified: user/marcel/mkimg/vmdk.c
==============================================================================
--- user/marcel/mkimg/vmdk.c	Thu May 15 12:44:00 2014	(r266123)
+++ user/marcel/mkimg/vmdk.c	Thu May 15 14:01:34 2014	(r266124)
@@ -116,7 +116,7 @@ vmdk_write(int fd)
 	uint64_t imagesz;
 	size_t gdsz, gtsz;
 	uint32_t sec;
-	int desc_len, n, ngrains, ngts;
+	int error, desc_len, n, ngrains, ngts;
 
 	imagesz = (image_get_size() * secsz) / VMDK_SECTOR_SIZE;
 
@@ -130,6 +130,9 @@ vmdk_write(int fd)
 	n = asprintf(&desc, desc_fmt, 1 /*version*/, 0 /*CID*/,
 	    (uintmax_t)imagesz /*size*/, "" /*name*/,
 	    ncyls /*cylinders*/, nheads /*heads*/, nsecs /*sectors*/);
+	if (n == -1)
+		return (ENOMEM);
+
 	desc_len = (n + VMDK_SECTOR_SIZE - 1) & ~(VMDK_SECTOR_SIZE - 1);
 	desc = realloc(desc, desc_len);
 	memset(desc + n, 0, desc_len - n);
@@ -146,8 +149,11 @@ vmdk_write(int fd)
 	ngts = (ngrains + VMDK_NGTES - 1) / VMDK_NGTES;
 	gdsz = (ngts * sizeof(uint32_t) + VMDK_SECTOR_SIZE - 1) &
 	    ~(VMDK_SECTOR_SIZE - 1);
-	gd = malloc(gdsz);
-	memset(gd, 0, gdsz);
+	gd = calloc(gdsz, 1);
+	if (gd == NULL) {
+		free(desc);
+		return (ENOMEM);
+	}
 
 	sec += gdsz / VMDK_SECTOR_SIZE;
 	for (n = 0; n < ngts; n++) {
@@ -165,8 +171,12 @@ vmdk_write(int fd)
 	be32enc(&hdr.nl_test, VMDK_NL_TEST);
 
 	gtsz = ngts * VMDK_NGTES * sizeof(uint32_t);
-	gt = malloc(gtsz);
-	memset(gt, 0, gtsz);
+	gt = calloc(gtsz, 1);
+	if (gt == NULL) {
+		free(gd);
+		free(desc);
+		return (ENOMEM);
+	}
 
 	for (n = 0; n < ngrains; n++)
 		le32enc(gt + n, sec + n * grainsz);
@@ -176,7 +186,13 @@ vmdk_write(int fd)
 	write(fd, gd, gdsz);
 	write(fd, gt, gtsz);
 	lseek(fd, sec * VMDK_SECTOR_SIZE, SEEK_SET);
-	return (image_copyout(fd));
+	error = image_copyout(fd);
+
+	free(gt);
+	free(gd);
+	free(desc);
+
+	return (error);
 }
 
 static struct mkimg_format vmdk_format = {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405151401.s4FE1YhE007990>