Commit ddbc7d06 authored by Arnd Bergmann's avatar Arnd Bergmann

y2038: move itimer reset into itimer.c

Preparing for a change to the itimer internals, stop using the
do_setitimer() symbol and instead use a new higher-level interface.

The do_getitimer()/do_setitimer functions can now be made static,
allowing the compiler to potentially produce better object code.
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent 4c22ea2b
...@@ -35,10 +35,11 @@ extern time64_t mktime64(const unsigned int year, const unsigned int mon, ...@@ -35,10 +35,11 @@ extern time64_t mktime64(const unsigned int year, const unsigned int mon,
extern u32 (*arch_gettimeoffset)(void); extern u32 (*arch_gettimeoffset)(void);
#endif #endif
struct itimerval; #ifdef CONFIG_POSIX_TIMERS
extern int do_setitimer(int which, struct itimerval *value, extern void clear_itimer(void);
struct itimerval *ovalue); #else
extern int do_getitimer(int which, struct itimerval *value); static inline void clear_itimer(void) {}
#endif
extern long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, int flags); extern long do_utimes(int dfd, const char __user *filename, struct timespec64 *times, int flags);
......
...@@ -73,7 +73,7 @@ static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, ...@@ -73,7 +73,7 @@ static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
value->it_interval = ns_to_timeval(interval); value->it_interval = ns_to_timeval(interval);
} }
int do_getitimer(int which, struct itimerval *value) static int do_getitimer(int which, struct itimerval *value)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
...@@ -197,7 +197,7 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, ...@@ -197,7 +197,7 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
#define timeval_valid(t) \ #define timeval_valid(t) \
(((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC)) (((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC))
int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) static int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
struct hrtimer *timer; struct hrtimer *timer;
...@@ -249,6 +249,17 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) ...@@ -249,6 +249,17 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
return 0; return 0;
} }
#ifdef CONFIG_SECURITY_SELINUX
void clear_itimer(void)
{
struct itimerval v = {};
int i;
for (i = 0; i < 3; i++)
do_setitimer(i, &v, NULL);
}
#endif
#ifdef __ARCH_WANT_SYS_ALARM #ifdef __ARCH_WANT_SYS_ALARM
/** /**
......
...@@ -2549,9 +2549,8 @@ static void selinux_bprm_committing_creds(struct linux_binprm *bprm) ...@@ -2549,9 +2549,8 @@ static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
static void selinux_bprm_committed_creds(struct linux_binprm *bprm) static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
{ {
const struct task_security_struct *tsec = selinux_cred(current_cred()); const struct task_security_struct *tsec = selinux_cred(current_cred());
struct itimerval itimer;
u32 osid, sid; u32 osid, sid;
int rc, i; int rc;
osid = tsec->osid; osid = tsec->osid;
sid = tsec->sid; sid = tsec->sid;
...@@ -2569,11 +2568,8 @@ static void selinux_bprm_committed_creds(struct linux_binprm *bprm) ...@@ -2569,11 +2568,8 @@ static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
rc = avc_has_perm(&selinux_state, rc = avc_has_perm(&selinux_state,
osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL); osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
if (rc) { if (rc) {
if (IS_ENABLED(CONFIG_POSIX_TIMERS)) { clear_itimer();
memset(&itimer, 0, sizeof itimer);
for (i = 0; i < 3; i++)
do_setitimer(i, &itimer, NULL);
}
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
if (!fatal_signal_pending(current)) { if (!fatal_signal_pending(current)) {
flush_sigqueue(&current->pending); flush_sigqueue(&current->pending);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment