On Friday, December 30, 2011, Ben Hutchings wrote:
> On Thu, 2011-12-29 at 23:33 +0100, Rafael J. Wysocki wrote:
> > On Thursday, December 29, 2011, Ben Hutchings wrote:
> > > On Tue, 2011-12-27 at 21:33 +0100, Ben Hutchings wrote:
> > > > This allows uswsusp built for i386 to run on an x86_64 kernel (tested
> > > > with Debian package version 1.0+20110509-2).
> > > 
> > > Now I wonder whether all this code was necessary.
> > > 
> > > [...]
> > > > +#ifdef CONFIG_COMPAT
> > > > +
> > > > +struct compat_resume_swap_area {
> > > > +       compat_loff_t offset;
> > > > +       u32 dev;
> > > > +} __packed;
> > > [...]
> > > 
> > > Is there actually any case where this doesn't have compatible layout
> > > with struct resume_swap_area?  It may have lower alignment, but
> > > misalignment is dealt with automatically when copying in/out of
> > > userland.
> > 
> > Quite frankly, I'm not 100% sure.
> 
> If it wasn't for the '__packed' in the declaration of struct
> resume_swap_area, there would be 4 trailing bytes of padding on 64-bit
> architectures and none on most 32-bit architectures.   But __packed
> should inhibit that padding.
> 
> I was apparently mistaken about put_user(); that would need to be
> changed to put_user_unaligned() if we want to handle compat_loff_t
> without a wrapper.
> 
> > > If the structure size was variable then the ioctl number would be as
> > > well, and commit cf007e3526a785a95a738d5a8fba44f1f4fe33e0 is supposed to
> > > have removed the last ioctls that had that problem.
> > > 
> > > So maybe the compat function can be as simple as:
> > > 
> > > static long
> > > snapshot_compat_ioctl(struct file *file, unsigned int cmd, unsigned long 
> > > arg)
> > > {
> > >   BUILD_BUG_ON(sizeof(loff_t) != sizeof(compat_loff_t));
> > >   BUILD_BUG_ON(sizeof(struct resume_swap_area) !=
> > >                sizeof(struct compat_resume_swap_area));
> > > 
> > 
> > Well, I'd prefer to fail the ioctl in the above situations instead of 
> > crashing
> > the kernel.
> 
> This is a compile-time check...

That's correct, sorry.

> > >   switch (cmd) {
> > >   case SNAPSHOT_SET_SWAP_AREA:
> > >   case SNAPSHOT_GET_IMAGE_SIZE:
> > >   case SNAPSHOT_CREATE_IMAGE:
> > >   case SNAPSHOT_AVAIL_SWAP_SIZE:
> > >   case SNAPSHOT_ALLOC_SWAP_PAGE:
> > >           return snapshot_ioctl(file, cmd,
> > >                                 (unsigned long) compat_ptr(arg));
> > > 
> > >   default:
> > >           return snapshot_ioctl(file, cmd, arg);
> > >   }
> > > }
> > 
> > Does it acutally work?
> 
> I haven't tested, but in any case testing on x86 wouldn't prove that
> this works for any other 32/64-bit architecture pair.

Well, if it doesn't work on x86, it will prove something. :-)

Thanks,
Rafael



-- 
To UNSUBSCRIBE, email to debian-kernel-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/201112300052.11690....@sisk.pl

Reply via email to