summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2010-05-05 09:44:50 -0700
committerUlrich Drepper <drepper@redhat.com>2010-05-05 09:44:50 -0700
commit5ae958d74180e2572d198bd7872c86f391de6da7 (patch)
tree72cdaca4eb866f52e07ebf77f7cf540789d4f958
parent3155f066219acaa9e7f8b8a3737f336f98e978b9 (diff)
Handle too-small buffers in Linux getlogin_r.
-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;
}