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 /sysdeps | |
parent | 3155f066219acaa9e7f8b8a3737f336f98e978b9 (diff) | |
download | glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.gz glibc-5ae958d74180e2572d198bd7872c86f391de6da7.tar.bz2 glibc-5ae958d74180e2572d198bd7872c86f391de6da7.zip |
Handle too-small buffers in Linux getlogin_r.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/getlogin_r.c | 17 |
1 files changed, 13 insertions, 4 deletions
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; } |