[SPARC64]: Report any user access faults in termios accessors.
authorDavid S. Miller <davem@davemloft.net>
Sat, 25 Jun 2005 03:11:03 +0000 (20:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 25 Jun 2005 03:11:03 +0000 (20:11 -0700)
Signed-off-by: David S. Miller <davem@davemloft.net>
include/asm-sparc64/termios.h

index 8effce0da0878f054ec6b3514a3f34b00a385fa5..9777a9cca88aa900a68545fccb1e7939bcf51a81 100644 (file)
@@ -100,16 +100,17 @@ struct winsize {
 #define user_termio_to_kernel_termios(termios, termio) \
 ({ \
        unsigned short tmp; \
-       get_user(tmp, &(termio)->c_iflag); \
+       int err; \
+       err = get_user(tmp, &(termio)->c_iflag); \
        (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
-       get_user(tmp, &(termio)->c_oflag); \
+       err |= get_user(tmp, &(termio)->c_oflag); \
        (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
-       get_user(tmp, &(termio)->c_cflag); \
+       err |= get_user(tmp, &(termio)->c_cflag); \
        (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
-       get_user(tmp, &(termio)->c_lflag); \
+       err |= get_user(tmp, &(termio)->c_lflag); \
        (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
-       copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
-       0; \
+       err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
+       err; \
 })
 
 /*
@@ -119,53 +120,56 @@ struct winsize {
  */
 #define kernel_termios_to_user_termio(termio, termios) \
 ({ \
-       put_user((termios)->c_iflag, &(termio)->c_iflag); \
-       put_user((termios)->c_oflag, &(termio)->c_oflag); \
-       put_user((termios)->c_cflag, &(termio)->c_cflag); \
-       put_user((termios)->c_lflag, &(termio)->c_lflag); \
-       put_user((termios)->c_line,  &(termio)->c_line); \
-       copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
+       int err; \
+       err  = put_user((termios)->c_iflag, &(termio)->c_iflag); \
+       err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \
+       err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \
+       err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \
+       err |= put_user((termios)->c_line,  &(termio)->c_line); \
+       err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
        if (!((termios)->c_lflag & ICANON)) { \
-               put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
-               put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
+               err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
+               err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
        } \
-       0; \
+       err; \
 })
 
 #define user_termios_to_kernel_termios(k, u) \
 ({ \
-       get_user((k)->c_iflag, &(u)->c_iflag); \
-       get_user((k)->c_oflag, &(u)->c_oflag); \
-       get_user((k)->c_cflag, &(u)->c_cflag); \
-       get_user((k)->c_lflag, &(u)->c_lflag); \
-       get_user((k)->c_line,  &(u)->c_line); \
-       copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
+       int err; \
+       err  = get_user((k)->c_iflag, &(u)->c_iflag); \
+       err |= get_user((k)->c_oflag, &(u)->c_oflag); \
+       err |= get_user((k)->c_cflag, &(u)->c_cflag); \
+       err |= get_user((k)->c_lflag, &(u)->c_lflag); \
+       err |= get_user((k)->c_line,  &(u)->c_line); \
+       err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
        if((k)->c_lflag & ICANON) { \
-               get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
-               get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
+               err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
+               err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
        } else { \
-               get_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
-               get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
+               err |= get_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
+               err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
        } \
-       0; \
+       err; \
 })
 
 #define kernel_termios_to_user_termios(u, k) \
 ({ \
-       put_user((k)->c_iflag, &(u)->c_iflag); \
-       put_user((k)->c_oflag, &(u)->c_oflag); \
-       put_user((k)->c_cflag, &(u)->c_cflag); \
-       put_user((k)->c_lflag, &(u)->c_lflag); \
-       put_user((k)->c_line, &(u)->c_line); \
-       copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
+       int err; \
+       err  = put_user((k)->c_iflag, &(u)->c_iflag); \
+       err |= put_user((k)->c_oflag, &(u)->c_oflag); \
+       err |= put_user((k)->c_cflag, &(u)->c_cflag); \
+       err |= put_user((k)->c_lflag, &(u)->c_lflag); \
+       err |= put_user((k)->c_line, &(u)->c_line); \
+       err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
        if(!((k)->c_lflag & ICANON)) { \
-               put_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
-               put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
+               err |= put_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
+               err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
        } else { \
-               put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
-               put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
+               err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
+               err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
        } \
-       0; \
+       err; \
 })
 
 #endif /* __KERNEL__ */