• P
    [PATCH] usb: Patch for USBDEVFS_IOCTL from 32-bit programs · c36fc889
    Pete Zaitcev 提交于
    Dell supplied me with the following test:
    
    #include<stdio.h>
    #include<errno.h>
    #include<sys/ioctl.h>
    #include<fcntl.h>
    #include<linux/usbdevice_fs.h>
    
    main(int argc,char*argv[])
    {
       struct usbdevfs_hub_portinfo hubPortInfo = {0};
       struct usbdevfs_ioctl command = {0};
       command.ifno = 0;
       command.ioctl_code = USBDEVFS_HUB_PORTINFO;
       command.data = (void*)&hubPortInfo;
       int fd, ret;
       if(argc != 2) {
         fprintf(stderr,"Usage: %s /proc/bus/usb/<BusNo>/<HubID>\n",argv[0]);
         fprintf(stderr,"Example: %s /proc/bus/usb/001/001\n",argv[0]);
         exit(1);
       }
       errno = 0;
       fd = open(argv[1],O_RDWR);
       if(fd < 0) {
         perror("open failed:");
         exit(errno);
       }
       errno = 0;
       ret = ioctl(fd,USBDEVFS_IOCTL,&command);
       printf("IOCTL return status:%d\n",ret);
       if(ret<0) {
         perror("IOCTL failed:");
         close(fd);
         exit(3);
       } else {
           printf("IOCTL passed:Num of ports %d\n",hubPortInfo.nports);
           close(fd);
           exit(0);
       }
       return 0;
    }
    
    I have verified that it breaks if built in 32 bit mode on x86_64 and that
    the patch below fixes it.
    Signed-off-by: NPete Zaitcev <zaitcev@redhat.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
    c36fc889
compat_ioctl.c 85.0 KB