W dniu 21 kwietnia 2011 13:15 użytkownik Arnd Bergmann <[email protected]> napisał:
> On Thursday 21 April 2011, Michał Mirosław wrote:
>> Subject: Re: [PATCH v4] mmc: Add ioctl to let userspace apps send ACMDs
>> Date: Wed, 13 Apr 2011 01:00:39 +0200
>> Message-Id: <[email protected]>
>>
>> Then I already provided an example of implementation that's
>> independent of endianness and avoids casts on userspace.
>
> Yes, v4 got that aspect right, as far as I can tell, aside
> from an incorrect cast (u8* instead of u8 __user *).
Just to have an understanding about the issue. In the mail I pointed
to, you argued that union will not work because of endianness
problems. I haven't seen other arguments against the union approach,
and I have provided a solution for this case.
BTW, kernel side can also avoid the cast if the union is extended with
32-bit field. This works because an address of a union is an address
of each of its fields. IOW all fields start at the same address
regardless if the they are 32 or 64 bits in size.
struct mmc_ioc_cmd {
union {
__u64 __data_ptr_storage64;
__u32 __data_ptr_storage32;
void __user *data_ptr;
};
...
};
[...]
static int mmc_blk_compat_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg)
{
struct mmc_ioc_cmd blk;
if (cmd != MMC_IOC_CMD)
return -EINVAL;
copy_from_user(compat_ptr(arg), &blk) ...
blk.data_ptr = compat_ptr(blk.__data_ptr_storage32);
return mmc_blk_ioctl_cmd(bdev, &blk);
}
Best Regards,
Michał Mirosław
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html