Revert 337f13046ff0 ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
[linux-2.6-microblaze.git] / kernel / rseq.c
index a4f86a9..35f7bd0 100644 (file)
 static int rseq_update_cpu_id(struct task_struct *t)
 {
        u32 cpu_id = raw_smp_processor_id();
+       struct rseq __user *rseq = t->rseq;
 
-       if (put_user(cpu_id, &t->rseq->cpu_id_start))
-               return -EFAULT;
-       if (put_user(cpu_id, &t->rseq->cpu_id))
-               return -EFAULT;
+       if (!user_write_access_begin(rseq, sizeof(*rseq)))
+               goto efault;
+       unsafe_put_user(cpu_id, &rseq->cpu_id_start, efault_end);
+       unsafe_put_user(cpu_id, &rseq->cpu_id, efault_end);
+       user_write_access_end();
        trace_rseq_update(t);
        return 0;
+
+efault_end:
+       user_write_access_end();
+efault:
+       return -EFAULT;
 }
 
 static int rseq_reset_rseq_cpu_id(struct task_struct *t)
@@ -120,8 +127,13 @@ static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
        u32 sig;
        int ret;
 
+#ifdef CONFIG_64BIT
+       if (get_user(ptr, &t->rseq->rseq_cs.ptr64))
+               return -EFAULT;
+#else
        if (copy_from_user(&ptr, &t->rseq->rseq_cs.ptr64, sizeof(ptr)))
                return -EFAULT;
+#endif
        if (!ptr) {
                memset(rseq_cs, 0, sizeof(*rseq_cs));
                return 0;
@@ -204,9 +216,13 @@ static int clear_rseq_cs(struct task_struct *t)
         *
         * Set rseq_cs to NULL.
         */
+#ifdef CONFIG_64BIT
+       return put_user(0UL, &t->rseq->rseq_cs.ptr64);
+#else
        if (clear_user(&t->rseq->rseq_cs.ptr64, sizeof(t->rseq->rseq_cs.ptr64)))
                return -EFAULT;
        return 0;
+#endif
 }
 
 /*
@@ -266,8 +282,6 @@ void __rseq_handle_notify_resume(struct ksignal *ksig, struct pt_regs *regs)
 
        if (unlikely(t->flags & PF_EXITING))
                return;
-       if (unlikely(!access_ok(t->rseq, sizeof(*t->rseq))))
-               goto error;
        ret = rseq_ip_fixup(regs);
        if (unlikely(ret < 0))
                goto error;
@@ -294,8 +308,7 @@ void rseq_syscall(struct pt_regs *regs)
 
        if (!t->rseq)
                return;
-       if (!access_ok(t->rseq, sizeof(*t->rseq)) ||
-           rseq_get_rseq_cs(t, &rseq_cs) || in_rseq_cs(ip, &rseq_cs))
+       if (rseq_get_rseq_cs(t, &rseq_cs) || in_rseq_cs(ip, &rseq_cs))
                force_sig(SIGSEGV);
 }