On 05/15/2014 08:21 AM, Kevin Wolf wrote: > We were relying on all compilers inserting the same padding in the > header struct that is used for the on-disk format. Let's not do that. > Mark the struct as packed and insert an explicit padding field for > compatibility. > > Cc: [email protected] > Signed-off-by: Kevin Wolf <[email protected]> > Reviewed-by: Benoit Canet <[email protected]> > --- > block/qcow.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/block/qcow.c b/block/qcow.c > index 937dd6d..3684794 100644 > --- a/block/qcow.c > +++ b/block/qcow.c > @@ -48,9 +48,10 @@ typedef struct QCowHeader { > uint64_t size; /* in bytes */ > uint8_t cluster_bits; > uint8_t l2_bits; > + uint16_t padding; > uint32_t crypt_method; > uint64_t l1_table_offset; > -} QCowHeader; > +} QEMU_PACKED QCowHeader;
Is it worth a compile-time assertion that the correct size is achieved?
[I don't know if glib provides such a macro, but gnulib has a verify()
macro that could be used as:
verify(sizeof(QCowHeader) == NNN)
which expands to _Static_assert(sizeof(QCowHeader) == NNN) in new enough
C compilers, and to something like
extern int (*dummy1(void)) [sizeof (struct dummy2 {
int dummy3: (sizeof(QCowHeader) == NNN) ? 1 : -1; })]
on older compilers for reliable compile-time detection]
But not a show-stopper to this patch as-is.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
