patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / kernel / sysctl.c
index c26f5f4..e95f475 100644 (file)
@@ -219,7 +219,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_OSTYPE,
                .procname       = "ostype",
                .data           = system_utsname.sysname,
-               .maxlen         = 64,
+               .maxlen         = sizeof(system_utsname.sysname),
                .mode           = 0444,
                .proc_handler   = &proc_doutsstring,
                .strategy       = &sysctl_string,
@@ -228,7 +228,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_OSRELEASE,
                .procname       = "osrelease",
                .data           = system_utsname.release,
-               .maxlen         = 64,
+               .maxlen         = sizeof(system_utsname.release),
                .mode           = 0444,
                .proc_handler   = &proc_doutsstring,
                .strategy       = &sysctl_string,
@@ -237,7 +237,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_VERSION,
                .procname       = "version",
                .data           = system_utsname.version,
-               .maxlen         = 64,
+               .maxlen         = sizeof(system_utsname.version),
                .mode           = 0444,
                .proc_handler   = &proc_doutsstring,
                .strategy       = &sysctl_string,
@@ -246,7 +246,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_NODENAME,
                .procname       = "hostname",
                .data           = system_utsname.nodename,
-               .maxlen         = 64,
+               .maxlen         = sizeof(system_utsname.nodename),
                .mode           = 0644,
                .proc_handler   = &proc_doutsstring,
                .strategy       = &sysctl_string,
@@ -255,7 +255,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_DOMAINNAME,
                .procname       = "domainname",
                .data           = system_utsname.domainname,
-               .maxlen         = 64,
+               .maxlen         = sizeof(system_utsname.domainname),
                .mode           = 0644,
                .proc_handler   = &proc_doutsstring,
                .strategy       = &sysctl_string,
@@ -393,7 +393,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_MODPROBE,
                .procname       = "modprobe",
                .data           = &modprobe_path,
-               .maxlen         = 256,
+               .maxlen         = KMOD_PATH_LEN,
                .mode           = 0644,
                .proc_handler   = &proc_dostring,
                .strategy       = &sysctl_string,
@@ -404,7 +404,7 @@ static ctl_table kern_table[] = {
                .ctl_name       = KERN_HOTPLUG,
                .procname       = "hotplug",
                .data           = &hotplug_path,
-               .maxlen         = 256,
+               .maxlen         = KMOD_PATH_LEN,
                .mode           = 0644,
                .proc_handler   = &proc_dostring,
                .strategy       = &sysctl_string,
@@ -748,6 +748,14 @@ static ctl_table vm_table[] = {
                .extra1         = (void *)&hugetlb_zero,
                .extra2         = (void *)&hugetlb_infinity,
         },
+        {
+               .ctl_name       = VM_HUGETLB_GROUP,
+               .procname       = "hugetlb_shm_group",
+               .data           = &sysctl_hugetlb_shm_group,
+               .maxlen         = sizeof(gid_t),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+        },
 #endif
        {
                .ctl_name       = VM_LOWER_ZONE_PROTECTION,
@@ -1387,7 +1395,7 @@ int proc_dostring(ctl_table *table, int write, struct file *filp,
                        if(copy_to_user(buffer, table->data, len))
                                return -EFAULT;
                if (len < *lenp) {
-                       if(put_user('\n', ((char *) buffer) + len))
+                       if(put_user('\n', ((char __user *) buffer) + len))
                                return -EFAULT;
                        len++;
                }
@@ -1450,6 +1458,7 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
        size_t left, len;
        
        char buf[TMPBUFLEN], *p;
+       char __user *s = buffer;
        
        if (!table->data || !table->maxlen || !*lenp ||
            (filp->f_pos && !write)) {
@@ -1468,12 +1477,12 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
                if (write) {
                        while (left) {
                                char c;
-                               if (get_user(c,(char __user *) buffer))
+                               if (get_user(c, s))
                                        return -EFAULT;
                                if (!isspace(c))
                                        break;
                                left--;
-                               buffer++;
+                               s++;
                        }
                        if (!left)
                                break;
@@ -1481,7 +1490,7 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
                        len = left;
                        if (len > sizeof(buf) - 1)
                                len = sizeof(buf) - 1;
-                       if(copy_from_user(buf, buffer, len))
+                       if (copy_from_user(buf, s, len))
                                return -EFAULT;
                        buf[len] = 0;
                        p = buf;
@@ -1499,7 +1508,7 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
                                break;
                        if (neg)
                                val = -val;
-                       buffer += len;
+                       s += len;
                        left -= len;
 
                        if (conv(&neg, &lval, i, 1, data))
@@ -1516,23 +1525,22 @@ static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
                        len = strlen(buf);
                        if (len > left)
                                len = left;
-                       if(copy_to_user(buffer, buf, len))
+                       if(copy_to_user(s, buf, len))
                                return -EFAULT;
                        left -= len;
-                       buffer += len;
+                       s += len;
                }
        }
 
        if (!write && !first && left) {
-               if(put_user('\n', (char *) buffer))
+               if(put_user('\n', s))
                        return -EFAULT;
-               left--, buffer++;
+               left--, s++;
        }
        if (write) {
-               p = (char *) buffer;
                while (left) {
                        char c;
-                       if (get_user(c, p++))
+                       if (get_user(c, s++))
                                return -EFAULT;
                        if (!isspace(c))
                                break;
@@ -1689,6 +1697,7 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write,
        int vleft, first=1, neg;
        size_t len, left;
        char buf[TMPBUFLEN], *p;
+       char __user *s = buffer;
        
        if (!table->data || !table->maxlen || !*lenp ||
            (filp->f_pos && !write)) {
@@ -1706,12 +1715,12 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write,
                if (write) {
                        while (left) {
                                char c;
-                               if (get_user(c, (char __user *) buffer))
+                               if (get_user(c, s))
                                        return -EFAULT;
                                if (!isspace(c))
                                        break;
                                left--;
-                               buffer++;
+                               s++;
                        }
                        if (!left)
                                break;
@@ -1719,7 +1728,7 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write,
                        len = left;
                        if (len > TMPBUFLEN-1)
                                len = TMPBUFLEN-1;
-                       if (copy_from_user(buf, buffer, len))
+                       if (copy_from_user(buf, s, len))
                                return -EFAULT;
                        buf[len] = 0;
                        p = buf;
@@ -1735,7 +1744,7 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write,
                                break;
                        if (neg)
                                val = -val;
-                       buffer += len;
+                       s += len;
                        left -= len;
 
                        if(neg)
@@ -1751,23 +1760,22 @@ static int do_proc_doulongvec_minmax(ctl_table *table, int write,
                        len = strlen(buf);
                        if (len > left)
                                len = left;
-                       if(copy_to_user(buffer, buf, len))
+                       if(copy_to_user(s, buf, len))
                                return -EFAULT;
                        left -= len;
-                       buffer += len;
+                       s += len;
                }
        }
 
        if (!write && !first && left) {
-               if(put_user('\n', (char *) buffer))
+               if(put_user('\n', s))
                        return -EFAULT;
-               left--, buffer++;
+               left--, s++;
        }
        if (write) {
-               p = (char *) buffer;
                while (left) {
                        char c;
-                       if (get_user(c, p++))
+                       if (get_user(c, s++))
                                return -EFAULT;
                        if (!isspace(c))
                                break;
@@ -1919,56 +1927,56 @@ int proc_dointvec_userhz_jiffies(ctl_table *table, int write, struct file *filp,
 #else /* CONFIG_PROC_FS */
 
 int proc_dostring(ctl_table *table, int write, struct file *filp,
-                 void *buffer, size_t *lenp)
+                 void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
-                           void *buffer, size_t *lenp)
+                           void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec(ctl_table *table, int write, struct file *filp,
-                 void *buffer, size_t *lenp)
+                 void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
-                       void *buffer, size_t *lenp)
+                       void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
-                   void *buffer, size_t *lenp)
+                   void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec_jiffies(ctl_table *table, int write, struct file *filp,
-                   void *buffer, size_t *lenp)
+                   void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec_userhz_jiffies(ctl_table *table, int write, struct file *filp,
-                   void *buffer, size_t *lenp)
+                   void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
-                   void *buffer, size_t *lenp)
+                   void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
                                      struct file *filp,
-                                     void *buffer, size_t *lenp)
+                                     void __user *buffer, size_t *lenp)
 {
     return -ENOSYS;
 }
@@ -2001,7 +2009,7 @@ int sysctl_string(ctl_table *table, int __user *name, int nlen,
                                len = table->maxlen;
                        if(copy_to_user(oldval, table->data, len))
                                return -EFAULT;
-                       if(put_user(0, ((char *) oldval) + len))
+                       if(put_user(0, ((char __user *) oldval) + len))
                                return -EFAULT;
                        if(put_user(len, oldlenp))
                                return -EFAULT;
@@ -2029,10 +2037,14 @@ int sysctl_intvec(ctl_table *table, int __user *name, int nlen,
                void __user *oldval, size_t __user *oldlenp,
                void __user *newval, size_t newlen, void **context)
 {
-       int i, *vec, *min, *max;
-       size_t length;
 
        if (newval && newlen) {
+               int __user *vec = (int __user *) newval;
+               int *min = (int *) table->extra1;
+               int *max = (int *) table->extra2;
+               size_t length;
+               int i;
+
                if (newlen % sizeof(int) != 0)
                        return -EINVAL;
 
@@ -2043,10 +2055,6 @@ int sysctl_intvec(ctl_table *table, int __user *name, int nlen,
                        newlen = table->maxlen;
                length = newlen / sizeof(int);
 
-               vec = (int *) newval;
-               min = (int *) table->extra1;
-               max = (int *) table->extra2;
-
                for (i = 0; i < length; i++) {
                        int value;
                        if (get_user(value, vec + i))
@@ -2073,7 +2081,7 @@ int sysctl_jiffies(ctl_table *table, int __user *name, int nlen,
                        if (olen!=sizeof(int))
                                return -EINVAL; 
                }
-               if (put_user(*(int *)(table->data) / HZ, (int *)oldval) || 
+               if (put_user(*(int *)(table->data)/HZ, (int __user *)oldval) ||
                    (oldlenp && put_user(sizeof(int),oldlenp)))
                        return -EFAULT;
        }
@@ -2081,7 +2089,7 @@ int sysctl_jiffies(ctl_table *table, int __user *name, int nlen,
                int new;
                if (newlen != sizeof(int))
                        return -EINVAL; 
-               if (get_user(new, (int *)newval))
+               if (get_user(new, (int __user *)newval))
                        return -EFAULT;
                *(int *)(table->data) = new*HZ; 
        }
@@ -2143,13 +2151,13 @@ int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
 }
 
 int proc_dointvec_jiffies(ctl_table *table, int write, struct file *filp,
-                         void *buffer, size_t *lenp)
+                         void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }
 
 int proc_dointvec_userhz_jiffies(ctl_table *table, int write, struct file *filp,
-                         void *buffer, size_t *lenp)
+                         void __user *buffer, size_t *lenp)
 {
        return -ENOSYS;
 }