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...

> >     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.

Ben.

-- 
Ben Hutchings
Design a system any fool can use, and only a fool will want to use it.

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to