|
@@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
|
|
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
|
|
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
|
|
goto bad;
|
|
|
+
|
|
|
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
|
|
+ /*
|
|
|
+ * If there is a transactional state then throw it away.
|
|
|
+ * The purpose of a sigreturn is to destroy all traces of the
|
|
|
+ * signal frame, this includes any transactional state created
|
|
|
+ * within in. We only check for suspended as we can never be
|
|
|
+ * active in the kernel, we are active, there is nothing better to
|
|
|
+ * do than go ahead and Bad Thing later.
|
|
|
+ * The cause is not important as there will never be a
|
|
|
+ * recheckpoint so it's not user visible.
|
|
|
+ */
|
|
|
+ if (MSR_TM_SUSPENDED(mfmsr()))
|
|
|
+ tm_reclaim_current(0);
|
|
|
+
|
|
|
if (__get_user(tmp, &rt_sf->uc.uc_link))
|
|
|
goto bad;
|
|
|
uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
|