Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24-git17 /kernel/sys.c

Filename:/kernel/sys.c
Lines Added:24
Lines Deleted:13
Also changed in: (Previous) 2.6.24-git16  2.6.24-git15  2.6.24  2.6.24-rc8  2.6.24-rc7  2.6.24-rc6 
(Following) 2.6.24-git18  2.6.24-git19  2.6.24-git20  2.6.24-git21  2.6.24-git22  2.6.25-rc1 

Location
[  2.6.24-git17
  [  kernel
     o  sys.c

Patch

diff --git a/kernel/sys.c b/kernel/sys.c
index d1fe71e..e3c08d4 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -315,7 +315,7 @@ static void kernel_kexec(void)
 #endif
 }
 
-void kernel_shutdown_prepare(enum system_states state)
+static void kernel_shutdown_prepare(enum system_states state)
 {
    blocking_notifier_call_chain(&reboot_notifier_list,
       (state == SYSTEM_HALT)?SYS_HALT:SYS_POWER_OFF, NULL);
@@ -1145,16 +1145,16 @@ static int groups_to_user(gid_t __user *grouplist,
     struct group_info *group_info)
 {
    int i;
-   int count = group_info->ngroups;
+   unsigned int count = group_info->ngroups;
 
    for (i = 0; i < group_info->nblocks; i++) {
-      int cp_count = min(NGROUPS_PER_BLOCK, count);
-      int off = i * NGROUPS_PER_BLOCK;
-      int len = cp_count * sizeof(*grouplist);
+      unsigned int cp_count = min(NGROUPS_PER_BLOCK, count);
+      unsigned int len = cp_count * sizeof(*grouplist);
 
-      if (copy_to_user(grouplist+off, group_info->blocks[i], len))
+      if (copy_to_user(grouplist, group_info->blocks[i], len))
          return -EFAULT;
 
+      grouplist += NGROUPS_PER_BLOCK;
       count -= cp_count;
    }
    return 0;
@@ -1165,16 +1165,16 @@ static int groups_from_user(struct group_info *group_info,
     gid_t __user *grouplist)
 {
    int i;
-   int count = group_info->ngroups;
+   unsigned int count = group_info->ngroups;
 
    for (i = 0; i < group_info->nblocks; i++) {
-      int cp_count = min(NGROUPS_PER_BLOCK, count);
-      int off = i * NGROUPS_PER_BLOCK;
-      int len = cp_count * sizeof(*grouplist);
+      unsigned int cp_count = min(NGROUPS_PER_BLOCK, count);
+      unsigned int len = cp_count * sizeof(*grouplist);
 
-      if (copy_from_user(group_info->blocks[i], grouplist+off, len))
+      if (copy_from_user(group_info->blocks[i], grouplist, len))
          return -EFAULT;
 
+      grouplist += NGROUPS_PER_BLOCK;
       count -= cp_count;
    }
    return 0;
@@ -1472,7 +1472,7 @@ asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)
    if ((new_rlim.rlim_max > old_rlim->rlim_max) &&
        !capable(CAP_SYS_RESOURCE))
       return -EPERM;
-   if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > NR_OPEN)
+   if (resource == RLIMIT_NOFILE && new_rlim.rlim_max > sysctl_nr_open)
       return -EPERM;
 
    retval = security_task_setrlimit(resource, &new_rlim);
@@ -1637,7 +1637,7 @@ asmlinkage long sys_umask(int mask)
    mask = xchg(¤t->fs->umask, mask & S_IRWXUGO);
    return mask;
 }
-    
+
 asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
            unsigned long arg4, unsigned long arg5)
 {
@@ -1742,6 +1742,17 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
          error = prctl_set_seccomp(arg2);
          break;
 
+      case PR_CAPBSET_READ:
+         if (!cap_valid(arg2))
+            return -EINVAL;
+         return !!cap_raised(current->cap_bset, arg2);
+      case PR_CAPBSET_DROP:
+#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
+         return cap_prctl_drop(arg2);
+#else
+         return -EINVAL;
+#endif
+
       default:
          error = -EINVAL;
          break;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.