On 21 September 2017 at 21:09, Arnd Bergmann <arnd@xxxxxxxx> wrote: > On Thu, Sep 21, 2017 at 8:18 AM, Baolin Wang <baolin.wang@xxxxxxxxxx> wrote: > >> +static int snd_timer_user_tread(void __user *argp, struct snd_timer_user *tu, >> + unsigned int cmd) >> +{ >> + int __user *p = argp; >> + int xarg, old_tread; >> + >> + if (tu->timeri) /* too late */ >> + return -EBUSY; >> + if (get_user(xarg, p)) >> + return -EFAULT; >> + >> + old_tread = tu->tread; >> +#if __BITS_PER_LONG == 64 >> + tu->tread = xarg ? 2 : 0; >> +#ifdef IA32_EMULATION >> + tu->tread = xarg ? 3 : 0; >> +#endif >> +#else >> + if (cmd == SNDRV_TIMER_IOCTL_TREAD64) >> + tu->tread = xarg ? 2 : 0; >> + else >> + tu->tread = xarg ? 1 : 0; >> +#endif > > The 64-bit case looks broken here: > > - The tread flag is different for compat and native mode, so you > must pass a flag to identify whether you are called from > __snd_timer_user_ioctl or from snd_timer_user_ioctl_compat(). I have some confusion here. For 64-bit, we will set tu->tread = 2 no matter it is native mode or compat mode, only we will set tu->tread = 3 for x86_32 in compat mode, right? So I think we do not need to identify whether called from native mode or compat mode. > > - On x86, you have to check whether calling user space process uses > the i386 or the x32 ABI by checking in_x32_syscall() Make sense. -- Baolin.wang Best Regards _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel