Skip to content

Commit dee1873

Browse files
committed
Merge tag 's390-6.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 fixes from Vasily Gorbik: - Fix double free of guarded storage and runtime instrumentation control blocks on fork() failure - Fix triggering write fault when VMA does not allow VM_WRITE * tag 's390-6.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: s390/mm: do not trigger write fault when vma does not allow VM_WRITE s390: fix double free of GS and RI CBs on fork() failure
2 parents 05519f2 + 41ac42f commit dee1873

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

arch/s390/kernel/process.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,18 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
9191

9292
memcpy(dst, src, arch_task_struct_size);
9393
dst->thread.fpu.regs = dst->thread.fpu.fprs;
94+
95+
/*
96+
* Don't transfer over the runtime instrumentation or the guarded
97+
* storage control block pointers. These fields are cleared here instead
98+
* of in copy_thread() to avoid premature freeing of associated memory
99+
* on fork() failure. Wait to clear the RI flag because ->stack still
100+
* refers to the source thread.
101+
*/
102+
dst->thread.ri_cb = NULL;
103+
dst->thread.gs_cb = NULL;
104+
dst->thread.gs_bc_cb = NULL;
105+
94106
return 0;
95107
}
96108

@@ -150,13 +162,11 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
150162
frame->childregs.flags = 0;
151163
if (new_stackp)
152164
frame->childregs.gprs[15] = new_stackp;
153-
154-
/* Don't copy runtime instrumentation info */
155-
p->thread.ri_cb = NULL;
165+
/*
166+
* Clear the runtime instrumentation flag after the above childregs
167+
* copy. The CB pointer was already cleared in arch_dup_task_struct().
168+
*/
156169
frame->childregs.psw.mask &= ~PSW_MASK_RI;
157-
/* Don't copy guarded storage control block */
158-
p->thread.gs_cb = NULL;
159-
p->thread.gs_bc_cb = NULL;
160170

161171
/* Set a new TLS ? */
162172
if (clone_flags & CLONE_SETTLS) {

arch/s390/mm/fault.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,9 @@ static inline vm_fault_t do_exception(struct pt_regs *regs, int access)
379379
flags = FAULT_FLAG_DEFAULT;
380380
if (user_mode(regs))
381381
flags |= FAULT_FLAG_USER;
382-
if (access == VM_WRITE || is_write)
382+
if (is_write)
383+
access = VM_WRITE;
384+
if (access == VM_WRITE)
383385
flags |= FAULT_FLAG_WRITE;
384386
mmap_read_lock(mm);
385387

0 commit comments

Comments
 (0)