Skip to content

Commit c1745f8

Browse files
committed
y2038: itimer: compat handling to itimer.c
The structure is only used in one place, moving it there simplifies the interface and helps with later changes to this code. Rename it to match the other time32 structures in the process. Reviewed-by: Thomas Gleixner <[email protected]> Signed-off-by: Arnd Bergmann <[email protected]>
1 parent 5e0fb1b commit c1745f8

File tree

3 files changed

+39
-42
lines changed

3 files changed

+39
-42
lines changed

include/linux/compat.h

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,7 @@ typedef __compat_gid32_t compat_gid_t;
116116
struct compat_sel_arg_struct;
117117
struct rusage;
118118

119-
struct compat_itimerval {
120-
struct old_timeval32 it_interval;
121-
struct old_timeval32 it_value;
122-
};
123-
124-
struct itimerval;
125-
int get_compat_itimerval(struct itimerval *, const struct compat_itimerval __user *);
126-
int put_compat_itimerval(struct compat_itimerval __user *, const struct itimerval *);
119+
struct old_itimerval32;
127120

128121
struct compat_tms {
129122
compat_clock_t tms_utime;
@@ -668,10 +661,10 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
668661

669662
/* kernel/itimer.c */
670663
asmlinkage long compat_sys_getitimer(int which,
671-
struct compat_itimerval __user *it);
664+
struct old_itimerval32 __user *it);
672665
asmlinkage long compat_sys_setitimer(int which,
673-
struct compat_itimerval __user *in,
674-
struct compat_itimerval __user *out);
666+
struct old_itimerval32 __user *in,
667+
struct old_itimerval32 __user *out);
675668

676669
/* kernel/kexec.c */
677670
asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,

kernel/compat.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -90,30 +90,6 @@ int compat_put_timespec(const struct timespec *ts, void __user *uts)
9090
}
9191
EXPORT_SYMBOL_GPL(compat_put_timespec);
9292

93-
int get_compat_itimerval(struct itimerval *o, const struct compat_itimerval __user *i)
94-
{
95-
struct compat_itimerval v32;
96-
97-
if (copy_from_user(&v32, i, sizeof(struct compat_itimerval)))
98-
return -EFAULT;
99-
o->it_interval.tv_sec = v32.it_interval.tv_sec;
100-
o->it_interval.tv_usec = v32.it_interval.tv_usec;
101-
o->it_value.tv_sec = v32.it_value.tv_sec;
102-
o->it_value.tv_usec = v32.it_value.tv_usec;
103-
return 0;
104-
}
105-
106-
int put_compat_itimerval(struct compat_itimerval __user *o, const struct itimerval *i)
107-
{
108-
struct compat_itimerval v32;
109-
110-
v32.it_interval.tv_sec = i->it_interval.tv_sec;
111-
v32.it_interval.tv_usec = i->it_interval.tv_usec;
112-
v32.it_value.tv_sec = i->it_value.tv_sec;
113-
v32.it_value.tv_usec = i->it_value.tv_usec;
114-
return copy_to_user(o, &v32, sizeof(struct compat_itimerval)) ? -EFAULT : 0;
115-
}
116-
11793
#ifdef __ARCH_WANT_SYS_SIGPROCMASK
11894

11995
/*

kernel/time/itimer.c

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,34 @@ SYSCALL_DEFINE2(getitimer, int, which, struct itimerval __user *, value)
112112
}
113113

114114
#ifdef CONFIG_COMPAT
115+
struct old_itimerval32 {
116+
struct old_timeval32 it_interval;
117+
struct old_timeval32 it_value;
118+
};
119+
120+
static int put_old_itimerval32(struct old_itimerval32 __user *o, const struct itimerval *i)
121+
{
122+
struct old_itimerval32 v32;
123+
124+
v32.it_interval.tv_sec = i->it_interval.tv_sec;
125+
v32.it_interval.tv_usec = i->it_interval.tv_usec;
126+
v32.it_value.tv_sec = i->it_value.tv_sec;
127+
v32.it_value.tv_usec = i->it_value.tv_usec;
128+
return copy_to_user(o, &v32, sizeof(struct old_itimerval32)) ? -EFAULT : 0;
129+
}
130+
115131
COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
116-
struct compat_itimerval __user *, it)
132+
struct old_itimerval32 __user *, it)
117133
{
118134
struct itimerval kit;
119135
int error = do_getitimer(which, &kit);
120136

121-
if (!error && put_compat_itimerval(it, &kit))
137+
if (!error && put_old_itimerval32(it, &kit))
122138
error = -EFAULT;
123139
return error;
124140
}
125141
#endif
126142

127-
128143
/*
129144
* The timer is automagically restarted, when interval != 0
130145
*/
@@ -310,15 +325,28 @@ SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
310325
}
311326

312327
#ifdef CONFIG_COMPAT
328+
static int get_old_itimerval32(struct itimerval *o, const struct old_itimerval32 __user *i)
329+
{
330+
struct old_itimerval32 v32;
331+
332+
if (copy_from_user(&v32, i, sizeof(struct old_itimerval32)))
333+
return -EFAULT;
334+
o->it_interval.tv_sec = v32.it_interval.tv_sec;
335+
o->it_interval.tv_usec = v32.it_interval.tv_usec;
336+
o->it_value.tv_sec = v32.it_value.tv_sec;
337+
o->it_value.tv_usec = v32.it_value.tv_usec;
338+
return 0;
339+
}
340+
313341
COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
314-
struct compat_itimerval __user *, in,
315-
struct compat_itimerval __user *, out)
342+
struct old_itimerval32 __user *, in,
343+
struct old_itimerval32 __user *, out)
316344
{
317345
struct itimerval kin, kout;
318346
int error;
319347

320348
if (in) {
321-
if (get_compat_itimerval(&kin, in))
349+
if (get_old_itimerval32(&kin, in))
322350
return -EFAULT;
323351
} else {
324352
memset(&kin, 0, sizeof(kin));
@@ -327,7 +355,7 @@ COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
327355
error = do_setitimer(which, &kin, out ? &kout : NULL);
328356
if (error || !out)
329357
return error;
330-
if (put_compat_itimerval(out, &kout))
358+
if (put_old_itimerval32(out, &kout))
331359
return -EFAULT;
332360
return 0;
333361
}

0 commit comments

Comments
 (0)