Merge tag 'fscrypt-for-linus' of git://git.kernel.org/pub/scm/fs/fscrypt/fscrypt
[linux-2.6-microblaze.git] / ipc / sem.c
index 745dc61..7da4504 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -488,18 +488,14 @@ static inline void sem_rmid(struct ipc_namespace *ns, struct sem_array *s)
 static struct sem_array *sem_alloc(size_t nsems)
 {
        struct sem_array *sma;
-       size_t size;
 
        if (nsems > (INT_MAX - sizeof(*sma)) / sizeof(sma->sems[0]))
                return NULL;
 
-       size = sizeof(*sma) + nsems * sizeof(sma->sems[0]);
-       sma = kvmalloc(size, GFP_KERNEL);
+       sma = kvzalloc(struct_size(sma, sems, nsems), GFP_KERNEL);
        if (unlikely(!sma))
                return NULL;
 
-       memset(sma, 0, size);
-
        return sma;
 }
 
@@ -1634,9 +1630,8 @@ out_up:
        return err;
 }
 
-long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
+static long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg, int version)
 {
-       int version;
        struct ipc_namespace *ns;
        void __user *p = (void __user *)arg;
        struct semid64_ds semid64;
@@ -1645,7 +1640,6 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
        if (semid < 0)
                return -EINVAL;
 
-       version = ipc_parse_version(&cmd);
        ns = current->nsproxy->ipc_ns;
 
        switch (cmd) {
@@ -1682,6 +1676,7 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
        case IPC_SET:
                if (copy_semid_from_user(&semid64, p, version))
                        return -EFAULT;
+               /* fall through */
        case IPC_RMID:
                return semctl_down(ns, semid, cmd, &semid64);
        default:
@@ -1691,8 +1686,22 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
 
 SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
 {
-       return ksys_semctl(semid, semnum, cmd, arg);
+       return ksys_semctl(semid, semnum, cmd, arg, IPC_64);
+}
+
+#ifdef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
+long ksys_old_semctl(int semid, int semnum, int cmd, unsigned long arg)
+{
+       int version = ipc_parse_version(&cmd);
+
+       return ksys_semctl(semid, semnum, cmd, arg, version);
+}
+
+SYSCALL_DEFINE4(old_semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
+{
+       return ksys_old_semctl(semid, semnum, cmd, arg);
 }
+#endif
 
 #ifdef CONFIG_COMPAT
 
@@ -1744,12 +1753,11 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
        }
 }
 
-long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
+static long compat_ksys_semctl(int semid, int semnum, int cmd, int arg, int version)
 {
        void __user *p = compat_ptr(arg);
        struct ipc_namespace *ns;
        struct semid64_ds semid64;
-       int version = compat_ipc_parse_version(&cmd);
        int err;
 
        ns = current->nsproxy->ipc_ns;
@@ -1792,8 +1800,22 @@ long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
 
 COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
 {
-       return compat_ksys_semctl(semid, semnum, cmd, arg);
+       return compat_ksys_semctl(semid, semnum, cmd, arg, IPC_64);
 }
+
+#ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
+long compat_ksys_old_semctl(int semid, int semnum, int cmd, int arg)
+{
+       int version = compat_ipc_parse_version(&cmd);
+
+       return compat_ksys_semctl(semid, semnum, cmd, arg, version);
+}
+
+COMPAT_SYSCALL_DEFINE4(old_semctl, int, semid, int, semnum, int, cmd, int, arg)
+{
+       return compat_ksys_old_semctl(semid, semnum, cmd, arg);
+}
+#endif
 #endif
 
 /* If the task doesn't already have a undo_list, then allocate one
@@ -2225,7 +2247,7 @@ long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
        return do_semtimedop(semid, tsems, nsops, NULL);
 }
 
-COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
+SYSCALL_DEFINE4(semtimedop_time32, int, semid, struct sembuf __user *, tsems,
                       unsigned int, nsops,
                       const struct old_timespec32 __user *, timeout)
 {