mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-05-13 10:45:32 +00:00
osf_sys.c: switch handling of timeval32/itimerval32 to copy_{to,from}_user()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
33dd955df2
commit
1cc6c4635e
1 changed files with 29 additions and 24 deletions
|
@ -952,37 +952,45 @@ struct itimerval32
|
||||||
static inline long
|
static inline long
|
||||||
get_tv32(struct timeval *o, struct timeval32 __user *i)
|
get_tv32(struct timeval *o, struct timeval32 __user *i)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
|
struct timeval32 tv;
|
||||||
(__get_user(o->tv_sec, &i->tv_sec) |
|
if (copy_from_user(&tv, i, sizeof(struct timeval32)))
|
||||||
__get_user(o->tv_usec, &i->tv_usec)));
|
return -EFAULT;
|
||||||
|
o->tv_sec = tv.tv_sec;
|
||||||
|
o->tv_usec = tv.tv_usec;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline long
|
static inline long
|
||||||
put_tv32(struct timeval32 __user *o, struct timeval *i)
|
put_tv32(struct timeval32 __user *o, struct timeval *i)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
|
return copy_to_user(o, &(struct timeval32){
|
||||||
(__put_user(i->tv_sec, &o->tv_sec) |
|
.tv_sec = o->tv_sec,
|
||||||
__put_user(i->tv_usec, &o->tv_usec)));
|
.tv_usec = o->tv_usec},
|
||||||
|
sizeof(struct timeval32));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline long
|
static inline long
|
||||||
get_it32(struct itimerval *o, struct itimerval32 __user *i)
|
get_it32(struct itimerval *o, struct itimerval32 __user *i)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
|
struct itimerval32 itv;
|
||||||
(__get_user(o->it_interval.tv_sec, &i->it_interval.tv_sec) |
|
if (copy_from_user(&itv, i, sizeof(struct itimerval32)))
|
||||||
__get_user(o->it_interval.tv_usec, &i->it_interval.tv_usec) |
|
return -EFAULT;
|
||||||
__get_user(o->it_value.tv_sec, &i->it_value.tv_sec) |
|
o->it_interval.tv_sec = itv.it_interval.tv_sec;
|
||||||
__get_user(o->it_value.tv_usec, &i->it_value.tv_usec)));
|
o->it_interval.tv_usec = itv.it_interval.tv_usec;
|
||||||
|
o->it_value.tv_sec = itv.it_value.tv_sec;
|
||||||
|
o->it_value.tv_usec = itv.it_value.tv_usec;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline long
|
static inline long
|
||||||
put_it32(struct itimerval32 __user *o, struct itimerval *i)
|
put_it32(struct itimerval32 __user *o, struct itimerval *i)
|
||||||
{
|
{
|
||||||
return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
|
return copy_to_user(o, &(struct itimerval32){
|
||||||
(__put_user(i->it_interval.tv_sec, &o->it_interval.tv_sec) |
|
.it_interval.tv_sec = o->it_interval.tv_sec,
|
||||||
__put_user(i->it_interval.tv_usec, &o->it_interval.tv_usec) |
|
.it_interval.tv_usec = o->it_interval.tv_usec,
|
||||||
__put_user(i->it_value.tv_sec, &o->it_value.tv_sec) |
|
.it_value.tv_sec = o->it_value.tv_sec,
|
||||||
__put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
|
.it_value.tv_usec = o->it_value.tv_usec},
|
||||||
|
sizeof(struct itimerval32));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -1101,20 +1109,17 @@ SYSCALL_DEFINE5(osf_select, int, n, fd_set __user *, inp, fd_set __user *, outp,
|
||||||
{
|
{
|
||||||
struct timespec end_time, *to = NULL;
|
struct timespec end_time, *to = NULL;
|
||||||
if (tvp) {
|
if (tvp) {
|
||||||
time_t sec, usec;
|
struct timeval tv;
|
||||||
|
|
||||||
to = &end_time;
|
to = &end_time;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
|
if (get_tv32(&tv, tvp))
|
||||||
|| __get_user(sec, &tvp->tv_sec)
|
|
||||||
|| __get_user(usec, &tvp->tv_usec)) {
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
|
||||||
|
|
||||||
if (sec < 0 || usec < 0)
|
if (tv.tv_sec < 0 || tv.tv_usec < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (poll_select_set_timeout(to, sec, usec * NSEC_PER_USEC))
|
if (poll_select_set_timeout(to, tv.tv_sec,
|
||||||
|
tv.tv_usec * NSEC_PER_USEC))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue