[Libguestfs] [PATCH nbdkit 4/4] common/protocol: Install <nbd-protocol.h> as a public header.

Eric Blake eblake at redhat.com
Wed Sep 25 12:28:00 UTC 2019


On 9/24/19 4:07 PM, Richard W.M. Jones wrote:
> Some further small changes are made to allow this header to be used
> from arbitrary ISO C compilers.
> 
> It can now be used from other projects.
> ---

>  
> +#if defined(__GNUC__) || defined(__clang__)
> +#define NBD_ATTRIBUTE_PACKED __attribute__((__packed__))
> +#else
> +#define NBD_ATTRIBUTE_PACKED
> +#endif
> +

Actually, I just realized that this fallback is wrong - it induces
padding bytes, and thus creates a struct incompatible with the wire
format.  We're better off making the #else use
#error Please port to your compiler's notion of a packed struct

so that the file serves as a reference, but does not get mistakenly used
with incorrect padding.

>  #define NBD_MAX_STRING 4096 /* Maximum length of a string field */
>  
>  /* Old-style handshake. */
> @@ -50,7 +56,7 @@ struct nbd_old_handshake {
>    uint16_t gflags;            /* global flags */
>    uint16_t eflags;            /* per-export flags */
>    char zeroes[124];           /* must be sent as zero bytes */
> -} __attribute__((packed));
> +} NBD_ATTRIBUTE_PACKED;

This one actually gets wire alignment without packing.

>  
>  #define NBD_OLD_VERSION UINT64_C(0x420281861253)
>  
> @@ -59,7 +65,7 @@ struct nbd_new_handshake {
>    char nbdmagic[8];           /* "NBDMAGIC" */
>    uint64_t version;           /* NBD_NEW_VERSION */
>    uint16_t gflags;            /* global flags */
> -} __attribute__((packed));
> +} NBD_ATTRIBUTE_PACKED;

This one would get tail padding, messing up anyone using sizeof(struct
nbd_new_handshake).

>  
...

> @@ -140,19 +146,19 @@ struct nbd_fixed_new_option_reply_info_export {
>    uint16_t info;                /* NBD_INFO_EXPORT */
>    uint64_t exportsize;          /* size of export */
>    uint16_t eflags;              /* per-export flags */
> -} __attribute__((packed));
> +} NBD_ATTRIBUTE_PACKED;
>  

and here's one that gets member offsets wrong, if packed is not used.


-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190925/b609d574/attachment.sig>


More information about the Libguestfs mailing list