On Wed, Feb 15, 2017 at 12:22 PM, Cyril Hrubis <chrubis@xxxxxxx> wrote: > [CCing linux api as well] >> The BLKRASET/BLKRAGET ioctls() take unsigned long, if I pass int * to >> the BLKRAGET ioctl on x86_64 (or on any other arch where sizeof(int) != >> sizeof(long)) the BLKRAGET ioctl will rewrite four bytes on the stack. >> >> If you look at block/ioctl.c in kernel sources you can clearly see that >> BLKRAGET ioctl calls put_long(). BLKFRAGET as well, fwiw, see compat_blkdev_ioctl(). We might as well include them in the list. >> I also wonder if it's OK to pass int value to ioctl() at all, the arg >> value seems to be unsigned long in the syscall definition in fs/ioctl.c >> and there does not seem to be any glibc magic around the syscall. This shouldn't matter, if you pass an 'int' into a function that takes a 'long', it will be extended if necessary. The question is more about how it gets interpreted, and in this case it's done by assigning to struct backing_dev_info { ... unsigned long ra_pages; /* max readahead in PAGE_SIZE units */ ... }; Large values will not be used in practice (these are capped by the I/O sizes), but I guess you can set a value larger than UINT_MAX and read it back later. >> man2/ioctl_list.2 | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/man2/ioctl_list.2 b/man2/ioctl_list.2 >> index 0165c77..c8efd66 100644 >> --- a/man2/ioctl_list.2 >> +++ b/man2/ioctl_list.2 >> @@ -311,8 +311,8 @@ l l l l. >> 0x0000125F BLKRRPART void >> 0x00001260 BLKGETSIZE unsigned long * >> 0x00001261 BLKFLSBUF void >> -0x00001262 BLKRASET int >> -0x00001263 BLKRAGET int * >> +0x00001262 BLKRASET unsigned long >> +0x00001263 BLKRAGET unsigned long * >> 0x00000001 FIBMAP int * // I-O >> 0x00000002 FIGETBSZ int * >> 0x80086601 FS_IOC_GETFLAGS int * Looks correct to me. Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html