diff -r -c3 linux-1.1.48/mm/mmap.c linux/mm/mmap.c
*** linux-1.1.48/mm/mmap.c Sun Aug 14 15:40:56 1994
--- linux/mm/mmap.c Tue Aug 23 11:11:52 1994
***************
*** 424,429 ****
--- 432,444 ----
*/
prev->vm_end = mpnt->vm_end;
prev->vm_next = mpnt->vm_next;
+ if (mpnt->vm_ops && mpnt->vm_ops->close) {
+ mpnt->vm_offset += mpnt->vm_end - mpnt->vm_start;
+ mpnt->vm_start = mpnt->vm_end;
+ mpnt->vm_ops->close(mpnt);
+ }
+ if (mpnt->vm_inode)
+ mpnt->vm_inode->i_count--;
kfree_s(mpnt, sizeof(*mpnt));
mpnt = prev;
}
diff -r -c3 linux-1.1.48/mm/mprotect.c linux/mm/mprotect.c
*** linux-1.1.48/mm/mprotect.c Sun Aug 14 15:40:56 1994
--- linux/mm/mprotect.c Sun Aug 14 02:24:34 1994
***************
*** 107,123 ****
unsigned long start, unsigned long end,
int newflags, int prot)
{
! int error;
! unsigned long tmpflags, tmpprot;
! tmpflags = vma->vm_flags;
! tmpprot = vma->vm_page_prot;
vma->vm_flags = newflags;
vma->vm_page_prot = prot;
! error = mprotect_fixup_end(vma, end, tmpflags, tmpprot);
! if (!error)
! error = mprotect_fixup_start(vma, start, tmpflags, tmpprot);
! return error;
}
static int mprotect_fixup(struct vm_area_struct * vma,
--- 111,146 ----
unsigned long start, unsigned long end,
int newflags, int prot)
{
! struct vm_area_struct * left, * right;
! left = (struct vm_area_struct *) kmalloc(sizeof(struct vm_area_struct), GFP_KERNEL);
! if (!left)
! return -ENOMEM;
! right = (struct vm_area_struct *) kmalloc(sizeof(struct vm_area_struct), GFP_KERNEL);
! if (!right) {
! kfree(left);
! return -ENOMEM;
! }
! *left = *vma;
! *right = *vma;
! left->vm_end = start;
! vma->vm_start = start;
! vma->vm_end = end;
! right->vm_start = end;
! vma->vm_offset += vma->vm_start - left->vm_start;
! right->vm_offset += right->vm_start - left->vm_start;
vma->vm_flags = newflags;
vma->vm_page_prot = prot;
! if (vma->vm_inode)
! vma->vm_inode->i_count += 2;
! if (vma->vm_ops && vma->vm_ops->dup) {
! vma->vm_ops->dup(left);
! vma->vm_ops->dup(right);
! }
! insert_vm_struct(current, left);
! insert_vm_struct(current, right);
! merge_segments(current->mm->mmap);
! return 0;
}
static int mprotect_fixup(struct vm_area_struct * vma,
***************
*** 155,161 ****
asmlinkage int sys_mprotect(unsigned long start, size_t len, unsigned long prot)
{
! unsigned long end;
struct vm_area_struct * vma;
if (start & ~PAGE_MASK)
--- 178,184 ----
asmlinkage int sys_mprotect(unsigned long start, size_t len, unsigned long prot)
{
! unsigned long end, tmp;
struct vm_area_struct * vma;
if (start & ~PAGE_MASK)
***************
*** 188,199 ****
if (vma->vm_end >= end)
return mprotect_fixup(vma, start, end, newflags);
! error = mprotect_fixup(vma, start, vma->vm_end, newflags);
if (error)
return error;
! start = vma->vm_end;
! vma = vma->vm_next;
! if (!vma || vma->vm_start != start)
! return -EFAULT;
}
}
--- 211,225 ----
if (vma->vm_end >= end)
return mprotect_fixup(vma, start, end, newflags);
! tmp = vma->vm_end;
! error = mprotect_fixup(vma, start, tmp, newflags);
if (error)
return error;
! start = tmp;
! if (vma->vm_end <= start) {
! vma = vma->vm_next;
! if (!vma || vma->vm_start != start)
! return -EFAULT;
! }
}
}