aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--sysdeps/mach/hurd/getlogin_r.c11
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 560bb95533..f50bf6f27f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,10 @@
* sysdeps/mach/hurd/getgroups.c: Return -1 and set EINVAL for
negative N or less than NGIDS.
+ * sysdeps/mach/hurd/getlogin_r.c: Make LOGIN non-static and change its
+ type to string_t. Set ERANGE as errno and return it if NAME is not big
+ enough. Use memcpy instead of strncpy.
+
2012-07-20 Joseph Myers <joseph@codesourcery.com>
* elf/Makefile (check-data): Remove.
diff --git a/sysdeps/mach/hurd/getlogin_r.c b/sysdeps/mach/hurd/getlogin_r.c
index 2539e6b0a0..5410709e71 100644
--- a/sysdeps/mach/hurd/getlogin_r.c
+++ b/sysdeps/mach/hurd/getlogin_r.c
@@ -29,13 +29,20 @@ getlogin_r (name, name_len)
char *name;
size_t name_len;
{
- static char login[1024]; /* XXX */
+ string_t login;
error_t err;
if (err = __USEPORT (PROC, __proc_getlogin (port, login)))
return errno = err;
- strncpy (name, login, name_len);
+ size_t len = __strnlen (login, sizeof login - 1) + 1;
+ if (len > name_len)
+ {
+ errno = ERANGE;
+ return errno;
+ }
+
+ memcpy (name, login, len);
return 0;
}
libc_hidden_def (getlogin_r)