|
@@ -1200,7 +1200,11 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,
|
|
if (err)
|
|
if (err)
|
|
goto out_fput;
|
|
goto out_fput;
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
+ if (down_write_killable(¤t->mm->mmap_sem)) {
|
|
|
|
+ err = -EINTR;
|
|
|
|
+ goto out_fput;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (addr && !(shmflg & SHM_REMAP)) {
|
|
if (addr && !(shmflg & SHM_REMAP)) {
|
|
err = -EINVAL;
|
|
err = -EINVAL;
|
|
if (addr + size < addr)
|
|
if (addr + size < addr)
|
|
@@ -1271,7 +1275,8 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
|
|
if (addr & ~PAGE_MASK)
|
|
if (addr & ~PAGE_MASK)
|
|
return retval;
|
|
return retval;
|
|
|
|
|
|
- down_write(&mm->mmap_sem);
|
|
|
|
|
|
+ if (down_write_killable(&mm->mmap_sem))
|
|
|
|
+ return -EINTR;
|
|
|
|
|
|
/*
|
|
/*
|
|
* This function tries to be smart and unmap shm segments that
|
|
* This function tries to be smart and unmap shm segments that
|