aboutsummaryrefslogtreecommitdiff
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)
downloadglibc-5ae958d74180e2572d198bd7872c86f391de6da7.zip
glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.gz
glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.bz2
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 a7fdafa..0d3d04a 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 f508959..c0c74be 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 d9c66fe..dad2671 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;
}