[libvirt] locking down struct size/layout in remote-protocol.x

Daniel P. Berrange berrange at redhat.com
Fri May 7 10:14:23 UTC 2010


On Thu, May 06, 2010 at 04:09:25PM -0600, Eric Blake wrote:
> On 05/06/2010 12:35 PM, Jim Meyering wrote:
> > This week we noticed that a change to struct remote_error
> > was causing trouble (new member addition changed the size of
> > the object being decoded -- bad for the protocol).
> > 
> > In order to ensure that no such changes sneak in again,
> > I'm planning to do the following.
> > 
> >     pdwtags src/libvirt_driver_remote_la-remote_protocol.o
> > 
> > prints, among other things, detailed type info for every struct:
> > 
> >     /* 89 */
> >     struct remote_nonnull_domain {
> >             remote_nonnull_string      name;                 /*     0     8 */
> >             remote_uuid                uuid;                 /*     8    16 */
> >             int                        id;                   /*    24     4 */
> > 
> >             /* size: 32, cachelines: 1, members: 3 */
> >             /* last cacheline: 32 bytes */
> > 
> >             /* BRAIN FART ALERT! 32 != 28 + 0(holes), diff = 4 */
> > 
> >     }; /* size: 32 */
> 
> Ouch.  Architecture sizing plays a role.  On a 32-bit machine, the first
> struct is:
> 
> /* 86 */
> struct remote_nonnull_domain {
>         remote_nonnull_string      name;                 /*     0     4 */
>         remote_uuid                uuid;                 /*     4    16 */
>         int                        id;                   /*    20     4 */
> 
>         /* size: 24, cachelines: 1, members: 3 */
>         /* last cacheline: 24 bytes */
> }; /* size: 24 */
> 
> 
> Are we sure migration between 32-bit and 64-bit hypervisors works?  And
> if it does, then these structs don't quite match what is actually sent
> over the wire.  At any rate,

Yes, the XDR protocol encoding is architecture + wordsize independant. The
struct sizes won't match what is sent on the wire, and the latter is the thing
we actually need to verify.

Perhaps marking all structs with __attribute__((packed))  will make then
architecture invariant enough for checking of the struct to suffice.

Daniel
-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list