提交 f8a4c3b5 编写于 作者: D Dave Miller 提交者: Linus Torvalds

tty: fix tty network driver interactions with TCGET/TCSET calls (x86 fix)

And to go with it Dave's type checking x86 termios headers.  I've updated
these as the original sent by Dave had some wrong types in it.
Signed-off-by: NAlan Cox <alan@redhat.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 94b3e03c
...@@ -41,6 +41,8 @@ struct termio { ...@@ -41,6 +41,8 @@ struct termio {
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/uaccess.h>
/* intr=^C quit=^\ erase=del kill=^U /* intr=^C quit=^\ erase=del kill=^U
eof=^D vtime=\0 vmin=\1 sxtc=\0 eof=^D vtime=\0 vmin=\1 sxtc=\0
start=^Q stop=^S susp=^Z eol=\0 start=^Q stop=^S susp=^Z eol=\0
...@@ -58,39 +60,53 @@ struct termio { ...@@ -58,39 +60,53 @@ struct termio {
*(unsigned short *) &(termios)->x = __tmp; \ *(unsigned short *) &(termios)->x = __tmp; \
} }
#define user_termio_to_kernel_termios(termios, termio) \ static inline int user_termio_to_kernel_termios(struct ktermios *termios,
({ \ struct termio __user *termio)
SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ {
SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ SET_LOW_TERMIOS_BITS(termios, termio, c_iflag);
SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ SET_LOW_TERMIOS_BITS(termios, termio, c_oflag);
SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ SET_LOW_TERMIOS_BITS(termios, termio, c_cflag);
copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ SET_LOW_TERMIOS_BITS(termios, termio, c_lflag);
}) return copy_from_user(termios->c_cc, termio->c_cc, NCC);
}
/* /*
* Translate a "termios" structure into a "termio". Ugh. * Translate a "termios" structure into a "termio". Ugh.
*/ */
#define kernel_termios_to_user_termio(termio, termios) \ static inline int kernel_termios_to_user_termio(struct termio __user *termio,
({ \ struct ktermios *termios)
put_user((termios)->c_iflag, &(termio)->c_iflag); \ {
put_user((termios)->c_oflag, &(termio)->c_oflag); \ put_user((termios)->c_iflag, &(termio)->c_iflag);
put_user((termios)->c_cflag, &(termio)->c_cflag); \ put_user((termios)->c_oflag, &(termio)->c_oflag);
put_user((termios)->c_lflag, &(termio)->c_lflag); \ put_user((termios)->c_cflag, &(termio)->c_cflag);
put_user((termios)->c_line, &(termio)->c_line); \ put_user((termios)->c_lflag, &(termio)->c_lflag);
copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ put_user((termios)->c_line, &(termio)->c_line);
}) return copy_to_user((termio)->c_cc, (termios)->c_cc, NCC);
}
#define user_termios_to_kernel_termios(k, u) \
copy_from_user(k, u, sizeof(struct termios2)) static inline int user_termios_to_kernel_termios(struct ktermios *k,
struct termios2 __user *u)
#define kernel_termios_to_user_termios(u, k) \ {
copy_to_user(u, k, sizeof(struct termios2)) return copy_from_user(k, u, sizeof(struct termios2));
}
#define user_termios_to_kernel_termios_1(k, u) \
copy_from_user(k, u, sizeof(struct termios)) static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
struct ktermios *k)
#define kernel_termios_to_user_termios_1(u, k) \ {
copy_to_user(u, k, sizeof(struct termios)) return copy_to_user(u, k, sizeof(struct termios2));
}
static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
struct termios __user *u)
{
return copy_from_user(k, u, sizeof(struct termios));
}
static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
struct ktermios *k)
{
return copy_to_user(u, k, sizeof(struct termios));
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册