diff options
| -rw-r--r-- | arch/s390/kernel/ptrace.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 2d716734b5b1..5dc7ad9e2fbf 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
| @@ -334,9 +334,14 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data) | |||
| 334 | unsigned long mask = PSW_MASK_USER; | 334 | unsigned long mask = PSW_MASK_USER; |
| 335 | 335 | ||
| 336 | mask |= is_ri_task(child) ? PSW_MASK_RI : 0; | 336 | mask |= is_ri_task(child) ? PSW_MASK_RI : 0; |
| 337 | if ((data & ~mask) != PSW_USER_BITS) | 337 | if ((data ^ PSW_USER_BITS) & ~mask) |
| 338 | /* Invalid psw mask. */ | ||
| 339 | return -EINVAL; | ||
| 340 | if ((data & PSW_MASK_ASC) == PSW_ASC_HOME) | ||
| 341 | /* Invalid address-space-control bits */ | ||
| 338 | return -EINVAL; | 342 | return -EINVAL; |
| 339 | if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)) | 343 | if ((data & PSW_MASK_EA) && !(data & PSW_MASK_BA)) |
| 344 | /* Invalid addressing mode bits */ | ||
| 340 | return -EINVAL; | 345 | return -EINVAL; |
| 341 | } | 346 | } |
| 342 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; | 347 | *(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data; |
| @@ -672,9 +677,12 @@ static int __poke_user_compat(struct task_struct *child, | |||
| 672 | 677 | ||
| 673 | mask |= is_ri_task(child) ? PSW32_MASK_RI : 0; | 678 | mask |= is_ri_task(child) ? PSW32_MASK_RI : 0; |
| 674 | /* Build a 64 bit psw mask from 31 bit mask. */ | 679 | /* Build a 64 bit psw mask from 31 bit mask. */ |
| 675 | if ((tmp & ~mask) != PSW32_USER_BITS) | 680 | if ((tmp ^ PSW32_USER_BITS) & ~mask) |
| 676 | /* Invalid psw mask. */ | 681 | /* Invalid psw mask. */ |
| 677 | return -EINVAL; | 682 | return -EINVAL; |
| 683 | if ((data & PSW32_MASK_ASC) == PSW32_ASC_HOME) | ||
| 684 | /* Invalid address-space-control bits */ | ||
| 685 | return -EINVAL; | ||
| 678 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 686 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | |
| 679 | (regs->psw.mask & PSW_MASK_BA) | | 687 | (regs->psw.mask & PSW_MASK_BA) | |
| 680 | (__u64)(tmp & mask) << 32; | 688 | (__u64)(tmp & mask) << 32; |
