ipc/shm: some shmat cleanups
authorDavidlohr Bueso <dave@stgolabs.net>
Mon, 8 May 2017 22:57:03 +0000 (15:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 May 2017 00:15:12 +0000 (17:15 -0700)
Clean up early flag and address some minutia.

Link: http://lkml.kernel.org/r/1486673582-6979-3-git-send-email-dave@stgolabs.net
Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
Cc: Manfred Spraul <manfred@colorfullife.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
ipc/shm.c

index 481d2a9c298ab14916543a040d4f45b9b69764e0..34c4344e8d4b2f00206208f1d2c8d48e85dd0e48 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -1095,11 +1095,11 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg,
              ulong *raddr, unsigned long shmlba)
 {
        struct shmid_kernel *shp;
-       unsigned long addr;
+       unsigned long addr = (unsigned long)shmaddr;
        unsigned long size;
        struct file *file;
        int    err;
-       unsigned long flags;
+       unsigned long flags = MAP_SHARED;
        unsigned long prot;
        int acc_mode;
        struct ipc_namespace *ns;
@@ -1111,7 +1111,8 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg,
        err = -EINVAL;
        if (shmid < 0)
                goto out;
-       else if ((addr = (ulong)shmaddr)) {
+
+       if (addr) {
                if (addr & (shmlba - 1)) {
                        /*
                         * Round down to the nearest multiple of shmlba.
@@ -1126,13 +1127,10 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg,
 #endif
                                        goto out;
                }
-               flags = MAP_SHARED | MAP_FIXED;
-       } else {
-               if ((shmflg & SHM_REMAP))
-                       goto out;
 
-               flags = MAP_SHARED;
-       }
+               flags |= MAP_FIXED;
+       } else if ((shmflg & SHM_REMAP))
+               goto out;
 
        if (shmflg & SHM_RDONLY) {
                prot = PROT_READ;