svn commit: r266132 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Thu May 15 14:48:26 UTC 2014


Author: marcel
Date: Thu May 15 14:48:25 2014
New Revision: 266132
URL: http://svnweb.freebsd.org/changeset/base/266132

Log:
  Replace unchecked calls to write(2) and lseek(2) with calls to
  sparse_write() and make sure to check for errors. In particular,
  lseek(2) may not be possible (e.g. the output file is stdout)
  and sparse_write(2) will do what is optimal (i.e. use lseek(2)
  when possible).

Modified:
  user/marcel/mkimg/vmdk.c

Modified: user/marcel/mkimg/vmdk.c
==============================================================================
--- user/marcel/mkimg/vmdk.c	Thu May 15 14:44:16 2014	(r266131)
+++ user/marcel/mkimg/vmdk.c	Thu May 15 14:48:25 2014	(r266132)
@@ -112,7 +112,8 @@ vmdk_write(int fd)
 {
 	struct vmdk_header hdr;
 	uint32_t *gt, *gd;
-	char *desc;
+	char *buf, *desc;
+	off_t cur, lim;
 	uint64_t imagesz;
 	size_t gdsz, gtsz;
 	uint32_t sec;
@@ -181,17 +182,37 @@ vmdk_write(int fd)
 	for (n = 0; n < ngrains; n++)
 		le32enc(gt + n, sec + n * grainsz);
 
-	write(fd, &hdr, VMDK_SECTOR_SIZE);
-	write(fd, desc, desc_len);
-	write(fd, gd, gdsz);
-	write(fd, gt, gtsz);
-	lseek(fd, sec * VMDK_SECTOR_SIZE, SEEK_SET);
-	error = image_copyout(fd);
-
+	error = 0;
+	if (!error && sparse_write(fd, &hdr, VMDK_SECTOR_SIZE) < 0)
+		error = errno;
+	if (!error && sparse_write(fd, desc, desc_len) < 0)
+		error = errno;
+	if (!error && sparse_write(fd, gd, gdsz) < 0)
+		error = errno;
+	if (!error && sparse_write(fd, gt, gtsz) < 0)
+		error = errno;
 	free(gt);
 	free(gd);
 	free(desc);
+	if (error)
+		return (error);
 
+	cur = VMDK_SECTOR_SIZE + desc_len + gdsz + gtsz;
+	lim = sec * VMDK_SECTOR_SIZE;
+	if (cur < lim) {
+		buf = calloc(VMDK_SECTOR_SIZE, 1);
+		if (buf == NULL)
+			error = ENOMEM;
+		while (!error && cur < lim) {
+			if (sparse_write(fd, buf, VMDK_SECTOR_SIZE) < 0)
+				error = errno;
+			cur += VMDK_SECTOR_SIZE;
+		}
+		if (buf != NULL)
+			free(buf);
+	}
+	if (!error)
+		error = image_copyout(fd);
 	return (error);
 }
 


More information about the svn-src-user mailing list