about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPino Toscano <toscano.pino@tiscali.it>2012-07-21 00:06:33 +0200
committerPino Toscano <toscano.pino@tiscali.it>2012-07-21 00:06:33 +0200
commit0ced335ac081474e12c89709c81cf2f2094c5351 (patch)
treecb1426667fd71bcbf91ed98ed5a2a6e91dce1236
parent898c7aaba55cb348d4a94286cbaf7e2920f0cd82 (diff)
downloadglibc-0ced335ac081474e12c89709c81cf2f2094c5351.tar.gz
glibc-0ced335ac081474e12c89709c81cf2f2094c5351.tar.xz
glibc-0ced335ac081474e12c89709c81cf2f2094c5351.zip
Hurd: compliance fixes for getgroups
Fail with EINVAL when the requested number of groups is negative,
or when it is positive but less than the actual number of groups.
-rw-r--r--ChangeLog3
-rw-r--r--sysdeps/mach/hurd/getgroups.c5
2 files changed, 7 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a804f2cf03..560bb95533 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,9 @@
 	* sysdeps/mach/hurd/lremovexattr.c: New file, copied from removexattr.c
 	with O_NOLINK passed to __file_name_lookup.
 
+	* sysdeps/mach/hurd/getgroups.c: Return -1 and set EINVAL for
+	negative N or less than NGIDS.
+
 2012-07-20  Joseph Myers  <joseph@codesourcery.com>
 
 	* elf/Makefile (check-data): Remove.
diff --git a/sysdeps/mach/hurd/getgroups.c b/sysdeps/mach/hurd/getgroups.c
index 157a981740..35b219ef66 100644
--- a/sysdeps/mach/hurd/getgroups.c
+++ b/sysdeps/mach/hurd/getgroups.c
@@ -30,6 +30,9 @@ __getgroups (n, gidset)
   int ngids;
   void *crit;
 
+  if (n < 0)
+    return __hurd_fail (EINVAL);
+
   crit = _hurd_critical_section_lock ();
   __mutex_lock (&_hurd_id.lock);
 
@@ -53,7 +56,7 @@ __getgroups (n, gidset)
       /* Now that the lock is released, we can safely copy the
 	 group set into the user's array, which might fault.  */
       if (ngids > n)
-	ngids = n;
+	return __hurd_fail (EINVAL);
       memcpy (gidset, gids, ngids * sizeof (gid_t));
     }
   else