[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#502816: [PATCH] snapshot: Implement compat_ioctl



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



Reply to: