VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / ipc / sem.c
index 3725673..71936c9 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -71,6 +71,8 @@
 #include <linux/time.h>
 #include <linux/smp_lock.h>
 #include <linux/security.h>
+#include <linux/vs_base.h>
+
 #include <asm/uaccess.h>
 #include "util.h"
 
@@ -116,7 +118,7 @@ void __init sem_init (void)
        ipc_init_ids(&sem_ids,sc_semmni);
 
 #ifdef CONFIG_PROC_FS
-       create_proc_read_entry("sysvipc/sem", 0, 0, sysvipc_sem_read_proc, NULL);
+       create_proc_read_entry("sysvipc/sem", 0, NULL, sysvipc_sem_read_proc, NULL);
 #endif
 }
 
@@ -175,6 +177,7 @@ static int newary (key_t key, int nsems, int semflg)
 
        sma->sem_perm.mode = (semflg & S_IRWXUGO);
        sma->sem_perm.key = key;
+       sma->sem_perm.xid = current->xid;
 
        sma->sem_perm.security = NULL;
        retval = security_sem_alloc(sma);
@@ -610,7 +613,7 @@ static int semctl_main(int semid, int semnum, int cmd, int version, union semun
        switch (cmd) {
        case GETALL:
        {
-               ushort *array = arg.array;
+               ushort __user *array = arg.array;
                int i;
 
                if(nsems > SEMMSL_FAST) {
@@ -1296,7 +1299,11 @@ static int sysvipc_sem_read_proc(char *buffer, char **start, off_t offset, int l
        for(i = 0; i <= sem_ids.max_id; i++) {
                struct sem_array *sma;
                sma = sem_lock(i);
-               if(sma) {
+               if (sma) {
+                       if (!vx_check(sma->sem_perm.xid, VX_IDENT)) {
+                               sem_unlock(sma);
+                               continue;
+                       }
                        len += sprintf(buffer + len, "%10d %10d  %4o %10lu %5u %5u %5u %5u %10lu %10lu\n",
                                sma->sem_perm.key,
                                sem_buildid(i,sma->sem_perm.seq),