diff options
author | 2018-10-02 16:42:38 +0000 | |
---|---|---|
committer | 2018-10-02 16:42:38 +0000 | |
commit | 31607d49530f2a817ce19c0db0b13efb3b78d798 (patch) | |
tree | 92551387978fbada82a28ca8bce97cb272b96a3c | |
parent | Add an option -T html -O toc to add a brief table of contents near (diff) | |
download | wireguard-openbsd-31607d49530f2a817ce19c0db0b13efb3b78d798.tar.xz wireguard-openbsd-31607d49530f2a817ce19c0db0b13efb3b78d798.zip |
Fix potential rounding errors when calculating the qcow2 l1 and ref tables sizes
OK ccardenas@ mlarkin@
-rw-r--r-- | usr.sbin/vmctl/vmctl.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/usr.sbin/vmctl/vmctl.c b/usr.sbin/vmctl/vmctl.c index 355bd4d0900..b09e1115ff7 100644 --- a/usr.sbin/vmctl/vmctl.c +++ b/usr.sbin/vmctl/vmctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmctl.c,v 1.59 2018/09/27 17:15:36 reyk Exp $ */ +/* $OpenBSD: vmctl.c,v 1.60 2018/10/02 16:42:38 reyk Exp $ */ /* * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org> @@ -872,20 +872,19 @@ create_qc2_imagefile(const char *imgfile_path, long imgsize) } __packed hdr; int fd, ret; uint64_t l1sz, refsz, disksz, initsz, clustersz; - uint64_t l1off, refoff, v, i; + uint64_t l1off, refoff, v, i, l1entrysz, refentrysz; uint16_t refs; disksz = 1024*1024*imgsize; clustersz = (1<<16); l1off = ALIGN(sizeof hdr, clustersz); - l1sz = disksz / (clustersz*clustersz/8); - if (l1sz == 0) - l1sz = 1; + + l1entrysz = clustersz * clustersz / 8; + l1sz = (disksz + l1entrysz - 1) / l1entrysz; refoff = ALIGN(l1off + 8*l1sz, clustersz); - refsz = disksz / (clustersz*clustersz*clustersz/2); - if (refsz == 0) - refsz = 1; + refentrysz = clustersz * clustersz * clustersz / 2; + refsz = (disksz + refentrysz - 1) / refentrysz; initsz = ALIGN(refoff + refsz*clustersz, clustersz); |