svn commit: r267945 - user/marcel/mkimg
Marcel Moolenaar
marcel at FreeBSD.org
Fri Jun 27 03:41:40 UTC 2014
Author: marcel
Date: Fri Jun 27 03:41:40 2014
New Revision: 267945
URL: http://svnweb.freebsd.org/changeset/base/267945
Log:
o Avoid using strncpy(), as it will confuse Coverity. Use integrals for
cookies and creator information. Just as meaningless; more cryptic.
o Construct the dynamuc header and write it out.
Modified:
user/marcel/mkimg/vhd.c
Modified: user/marcel/mkimg/vhd.c
==============================================================================
--- user/marcel/mkimg/vhd.c Fri Jun 27 00:37:03 2014 (r267944)
+++ user/marcel/mkimg/vhd.c Fri Jun 27 03:41:40 2014 (r267945)
@@ -52,13 +52,12 @@ __FBSDID("$FreeBSD$");
* o The timestamp is seconds since 1/1/2000 12:00:00 AM UTC
*/
-#define VHD_BLOCK_SIZE 4096 /* In sectors; 2MB blocks */
#define VHD_SECTOR_SIZE 512
+#define VHD_BLOCK_SIZE (4096 * VHD_SECTOR_SIZE) /* 2MB blocks */
struct vhd_footer {
- char cookie[8];
-#define VHD_COOKIE_MICROSOFT "conectix"
-#define VHD_COOKIE_FREEBSD "FreeBSD"
+ uint64_t cookie;
+#define VHD_FOOTER_COOKIE 0x636f6e6563746978
uint32_t features;
#define VHD_FEATURES_TEMPORARY 0x01
#define VHD_FEATURES_RESERVED 0x02
@@ -66,18 +65,12 @@ struct vhd_footer {
#define VHD_VERSION 0x00010000
uint64_t data_offset;
uint32_t timestamp;
- char creator_tool[4];
-#define VHD_CREATOR_TOOL_MS_VPC "vpc " /* Virtual PC */
-#define VHD_CREATOR_TOOL_MS_VS "vs " /* Virtual Server */
-#define VHD_CREATOR_TOOL_FBSD "mkim" /* FreeBSD mkimg */
+ uint32_t creator_tool;
+#define VHD_CREATOR_TOOL 0x2a696d67 /* FreeBSD mkimg */
uint32_t creator_version;
-#define VHD_CREATOR_VERS_MS_VPC 0x00050000
-#define VHD_CREATOR_VERS_MS_VS 0x00010000
-#define VHD_CREATOR_VERS_FBSD 0x00010000
- char creator_os[4];
-#define VHD_CREATOR_OS_WINDOWS "Wi2k"
-#define VHD_CREATOR_OS_MAC "Mac "
-#define VHD_CREATOR_OS_FREEBSD "FBSD"
+#define VHD_CREATOR_VERSION 0x00010000
+ uint32_t creator_os;
+#define VHD_CREATOR_OS 0x46425344
uint64_t original_size;
uint64_t current_size;
uint16_t cylinders;
@@ -97,6 +90,7 @@ _Static_assert(sizeof(struct vhd_footer)
struct vhd_dyn_header {
uint64_t cookie;
+#define VHD_HEADER_COOKIE 0x6378737061727365
uint64_t data_offset;
uint64_t table_offset;
uint32_t version;
@@ -122,10 +116,11 @@ _Static_assert(sizeof(struct vhd_dyn_hea
static int
vhd_resize(lba_t imgsz)
{
+ uint64_t imagesz;
- /* Round to a multiple of the block size. */
- imgsz = (imgsz + VHD_BLOCK_SIZE - 1) & ~(VHD_BLOCK_SIZE - 1);
- return (image_set_size(imgsz));
+ imagesz = imgsz * secsz;
+ imagesz = (imagesz + VHD_BLOCK_SIZE - 1) & ~(VHD_BLOCK_SIZE - 1);
+ return (image_set_size(imagesz / secsz));
}
static uint32_t
@@ -176,16 +171,14 @@ vhd_write(int fd)
imgsz = image_get_size() * secsz;
memset(&footer, 0, sizeof(footer));
- strncpy(footer.cookie, VHD_COOKIE_FREEBSD, sizeof(footer.cookie));
+ be64enc(&footer.cookie, VHD_FOOTER_COOKIE);
be32enc(&footer.features, VHD_FEATURES_RESERVED);
be32enc(&footer.version, VHD_VERSION);
- be32enc(&footer.data_offset, VHD_SECTOR_SIZE);
+ be64enc(&footer.data_offset, sizeof(footer));
be32enc(&footer.timestamp, vhd_timestamp());
- strncpy(footer.creator_tool, VHD_CREATOR_TOOL_FBSD,
- sizeof(footer.creator_tool));
- be32enc(&footer.creator_version, VHD_CREATOR_VERS_FBSD);
- strncpy(footer.creator_os, VHD_CREATOR_OS_FREEBSD,
- sizeof(footer.creator_os));
+ be32enc(&footer.creator_tool, VHD_CREATOR_TOOL);
+ be32enc(&footer.creator_version, VHD_CREATOR_VERSION);
+ be32enc(&footer.creator_os, VHD_CREATOR_OS);
be64enc(&footer.original_size, imgsz);
be64enc(&footer.current_size, imgsz);
/* XXX Geometry */
@@ -193,11 +186,20 @@ vhd_write(int fd)
uuidgen(&id, 1);
vhd_uuid_enc(&footer.id, &id);
be32enc(&footer.checksum, vhd_checksum(&footer, sizeof(footer)));
-
- if (sparse_write(fd, &footer, VHD_SECTOR_SIZE) < 0)
+ if (sparse_write(fd, &footer, sizeof(footer)) < 0)
return (errno);
memset(&header, 0, sizeof(header));
+ be64enc(&header.cookie, VHD_HEADER_COOKIE);
+ be64enc(&header.data_offset, ~0ULL);
+ be64enc(&header.table_offset, sizeof(footer) + sizeof(header));
+ be32enc(&header.version, VHD_VERSION);
+ be32enc(&header.max_entries, imgsz / VHD_BLOCK_SIZE);
+ be32enc(&header.block_size, VHD_BLOCK_SIZE);
+ be32enc(&header.checksum, vhd_checksum(&header, sizeof(header)));
+ if (sparse_write(fd, &header, sizeof(header)) < 0)
+ return (errno);
+
return (image_copyout(fd));
}
More information about the svn-src-user
mailing list