puzzle of ioctl decode in file_ioctl.c and userfaultfd.c

Dr. David Alan Gilbert dgilbert at redhat.com
Mon Dec 12 10:39:43 UTC 2016


* jingpiao chen (chenjingpiao at gmail.com) wrote:
> Version:4.14-ab28d7f1e5ab9b51f5708741bd13f92e768123d4
> 
> 2.userfaultfd.c:126
> 
> 126         case UFFDIO_UNREGISTER:
> 127         case UFFDIO_WAKE: {
> 128                 struct uffdio_range ura;
> 129                 tprints(", ");
> 130                 if (!umove_or_printaddr(tcp, arg, &ura))
> 131                         tprintf_uffdio_range(&ura);
> 132                 return RVAL_DECODED | 1;
> 133         }
> 
> /usr/include/linux/userfaultfd.h:
> 51 #define UFFDIO_UNREGISTER       _IOR(UFFDIO, _UFFDIO_UNREGISTER,        \
> 52                                      struct uffdio_range)
> 53 #define UFFDIO_WAKE             _IOR(UFFDIO, _UFFDIO_WAKE,      \
> 54                                      struct uffdio_range)
> 
> UFFDIO_UNREGISTER and UFFDIO_WAKE are read data, why it get data
> when entering.
> I means it should replace by:

From memory, the problem is that the kernel macros are wrong (and
can't be fixed since they'd break ABI).  
In both those calls it's userland who passes data to the kernel
(giving the address range to be unregisters/woken).

> 127         case UFFDIO_UNREGISTER:
> 128         case UFFDIO_WAKE: {
> 129                 if (entering(tcp))
> 130                         return 0;
> 131
> 132                 struct uffdio_range ura;
> 133                 tprints(", ");
> 134                 if (!umove_or_printaddr(tcp, arg, &ura))
> 135                         tprintf_uffdio_range(&ura);
> 136                 return RVAL_DECODED | 1;
> 137         }

Dave

--
Dr. David Alan Gilbert / dgilbert at redhat.com / Manchester, UK




More information about the Strace-devel mailing list