Commit b80d60e1 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'parisc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6

Pull PARISC fixes from James Bottomley:
 "This is two bug fixes: one fixes a loophole where rt_sigprocmask()
  with the wrong values panics the box (Denial of Service) and the other
  fixes an aliasing problem with get_shared_area() which could cause
  data corruption.

  Signed-off-by: James Bottomley <JBottomley@Parallels.com>"

* tag 'parisc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6:
  [PARISC] fix user-triggerable panic on parisc
  [PARISC] fix virtual aliasing issue in get_shared_area()
parents a2d2eda7 441a179d
...@@ -65,7 +65,8 @@ put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) ...@@ -65,7 +65,8 @@ put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
{ {
compat_sigset_t s; compat_sigset_t s;
if (sz != sizeof *set) panic("put_sigset32()"); if (sz != sizeof *set)
return -EINVAL;
sigset_64to32(&s, set); sigset_64to32(&s, set);
return copy_to_user(up, &s, sizeof s); return copy_to_user(up, &s, sizeof s);
...@@ -77,7 +78,8 @@ get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) ...@@ -77,7 +78,8 @@ get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
compat_sigset_t s; compat_sigset_t s;
int r; int r;
if (sz != sizeof *set) panic("put_sigset32()"); if (sz != sizeof *set)
return -EINVAL;
if ((r = copy_from_user(&s, up, sz)) == 0) { if ((r = copy_from_user(&s, up, sz)) == 0) {
sigset_32to64(set, &s); sigset_32to64(set, &s);
......
...@@ -73,6 +73,8 @@ static unsigned long get_shared_area(struct address_space *mapping, ...@@ -73,6 +73,8 @@ static unsigned long get_shared_area(struct address_space *mapping,
struct vm_area_struct *vma; struct vm_area_struct *vma;
int offset = mapping ? get_offset(mapping) : 0; int offset = mapping ? get_offset(mapping) : 0;
offset = (offset + (pgoff << PAGE_SHIFT)) & 0x3FF000;
addr = DCACHE_ALIGN(addr - offset) + offset; addr = DCACHE_ALIGN(addr - offset) + offset;
for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
......
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