lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 16 Apr 2008 16:57:24 -0500
From:	Hollis Blanchard <hollisb@...ibm.com>
To:	Anthony Liguori <aliguori@...ibm.com>
Cc:	Rusty Russell <rusty@...tcorp.com.au>,
	Ryan Harper <ryanh@...ibm.com>,
	virtualization@...ts.linux-foundation.org,
	linux-kernel@...r.kernel.org, kvm-devel@...ts.sourceforge.net
Subject: Re: [PATCH] add virtio disk geometry feature

On Wednesday 16 April 2008 16:32:30 Anthony Liguori wrote:
> > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
> > --- a/drivers/block/virtio_blk.c
> > +++ b/drivers/block/virtio_blk.c
> > @@ -157,10 +157,25 @@ static int virtblk_ioctl(struct inode *i
> >  /* We provide getgeo only to please some old bootloader/partitioning 
tools */
> >  static int virtblk_getgeo(struct block_device *bd, struct hd_geometry 
*geo)
> >  {
> > -     /* some standard values, similar to sd */
> > -     geo->heads = 1 << 6;
> > -     geo->sectors = 1 << 5;
> > -     geo->cylinders = get_capacity(bd->bd_disk) >> 11;
> > +     struct virtio_blk *vblk = bd->bd_disk->private_data;
> > +     struct virtio_blk_geometry vgeo;
> > +     int err;
> > +
> > +     /* see if the host passed in geometry config */
> > +     err = virtio_config_val(vblk->vdev, VIRTIO_BLK_F_GEOMETRY,
> > +                             offsetof(struct virtio_blk_config, 
geometry),
> > +                             &vgeo);
> > +
> > +     if (!err) {
> > +             geo->heads = vgeo.heads;
> > +             geo->sectors = vgeo.sectors;
> > +             geo->cylinders = vgeo.cylinders;
> > +     } else {
> > +             /* some standard values, similar to sd */
> > +             geo->heads = 1 << 6;
> > +             geo->sectors = 1 << 5;
> > +             geo->cylinders = get_capacity(bd->bd_disk) >> 11;
> > +     }
> >       return 0;
> >  }
> >   
> 
> You're probably breaking PPC since the values in the config space are in 
> little endian format.  virtio_config_val does automagic endianness 
> conversion if the size is 2, 4, or 8.  In this case, the structure size 
> is 4 so the endianness conversion will do the wrong thing.

Good catch; byte-swapping an entire structure is a terrible terrible idea.

> Magic endianness conversion based on read size is looking pretty evil to 
> me... Perhaps we need explicit *_val[8,16,32,64]?

Implicit byteswapping based on access size is the standard way of implementing 
accessors.

In this case, reading each structure member individually will do the right 
implicit swapping, rather than trying to load the whole thing as a single 
access.

-- 
Hollis Blanchard
IBM Linux Technology Center

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ