diff options
author | Ulrich Drepper <drepper@redhat.com> | 2010-05-05 09:44:50 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2010-05-05 09:44:50 -0700 |
commit | 5ae958d74180e2572d198bd7872c86f391de6da7 (patch) | |
tree | 72cdaca4eb866f52e07ebf77f7cf540789d4f958 | |
parent | 3155f066219acaa9e7f8b8a3737f336f98e978b9 (diff) | |
download | glibc-5ae958d74180e2572d198bd7872c86f391de6da7.zip glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.gz glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.bz2 |
Handle too-small buffers in Linux getlogin_r.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getlogin_r.c | 17 |
3 files changed, 18 insertions, 5 deletions
@@ -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>. @@ -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; } |