about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--NEWS2
-rw-r--r--sysdeps/unix/sysv/linux/getlogin_r.c17
3 files changed, 18 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index a7fdafa413..0d3d04a59f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2010-05-05  Ulrich Drepper  <drepper@redhat.com>
 
+	[BZ #11571]
+	* sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Handle
+	too small buffers according to the standard.
+
 	* sysdeps/unix/sysv/linux/kernel-features.h: Alpha doesn't have to be
 	handled here anymore.
 	Patch mostly by Matt Turner <mattst88@gmail.com>.
diff --git a/NEWS b/NEWS
index f508959c5e..c0c74be6f7 100644
--- a/NEWS
+++ b/NEWS
@@ -16,7 +16,7 @@ Version 2.12
   11185, 11186, 11187, 11188, 11189, 11190, 11191, 11192, 11193, 11194,
   11200, 11230, 11235, 11242, 11254, 11258, 11271, 11272, 11276, 11279,
   11287, 11292, 11319, 11332, 11333, 11387, 11389, 11390, 11394, 11397,
-  11410, 11438, 11449, 11470, 11471, 11520, 11537, 11538
+  11410, 11438, 11449, 11470, 11471, 11520, 11537, 11538, 11571
 
 * New interfaces: pthread_getname_np, pthread_setname_np
 
diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c
index d9c66fe259..dad2671e80 100644
--- a/sysdeps/unix/sysv/linux/getlogin_r.c
+++ b/sysdeps/unix/sysv/linux/getlogin_r.c
@@ -81,13 +81,22 @@ __getlogin_r_loginuid (name, namesize)
   if (tpwd == NULL)
     goto fail;
 
-  strncpy (name, pwd.pw_name, namesize - 1);
-  name[namesize - 1] = '\0';
-
+  int result = 0;
+  size_t needed = strlen (pwd.pw_name) + 1;
+  if (needed > namesize)
+    {
+      __set_errno (ERANGE);
+      result = ERANGE;
+      goto out;
+    }
+
+  memcpy (name, pwd.pw_name, needed);
+
+ out:
   if (use_malloc)
     free (buf);
 
-  return 0;
+  return result;
 }