On Fri, 2019-11-08 at 21:34 +0100, Arnd Bergmann wrote: > The layout of struct timeval is different on sparc64 from > anything else, and the patch I did long ago failed to take > this into account. > > Change it now to handle sparc64 user space correctly again. > > Quite likely nobody cares about parallel ports on sparc64, > but there is no reason not to fix it. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 9a450484089d ("lp: support 64-bit time_t user space") > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> > --- > drivers/char/lp.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/char/lp.c b/drivers/char/lp.c > index 7c9269e3477a..bd95aba1f9fe 100644 > --- a/drivers/char/lp.c > +++ b/drivers/char/lp.c > @@ -713,6 +713,10 @@ static int lp_set_timeout64(unsigned int minor, void __user *arg) > if (copy_from_user(karg, arg, sizeof(karg))) > return -EFAULT; > > + /* sparc64 suseconds_t is 32-bit only */ > + if (IS_ENABLED(CONFIG_SPARC64) && !in_compat_syscall()) > + karg[1] >>= 32; > + > return lp_set_timeout(minor, karg[0], karg[1]); > } > It seems like it would make way more sense to use __kernel_old_timeval. Then you don't have to explicitly handle the sparc64 oddity. As it is, this still over-reads from user-space which might result in a spurious -EFAULT. Ben. -- Ben Hutchings, Software Developer Codethink Ltd https://www.codethink.co.uk/ Dale House, 35 Dale Street Manchester, M1 2HF, United Kingdom