diff options
author | Gary Mills <gary_mills@fastmail.fm> | 2013-10-08 08:27:49 -0700 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2013-10-08 13:41:54 -0700 |
commit | 0a1278f26ea4b7c8c0285d4f2d6c5b680904aa01 (patch) | |
tree | 575c8267c793e949b411067df349bf19ba9f9fb5 /usr/src/lib/libc | |
parent | 2acef22db7808606888f8f92715629ff3ba555b9 (diff) | |
download | illumos-joyent-0a1278f26ea4b7c8c0285d4f2d6c5b680904aa01.tar.gz |
2989 LOGNAME_MAX should be increased to 32
1166 useradd warns on names with more than 8 chars
Reviewed by: Richard PALO <richard.palo@free.fr>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Reviewed by: Andy Stormont <AStormont@racktopsystems.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r-- | usr/src/lib/libc/port/gen/getlogin.c | 123 | ||||
-rw-r--r-- | usr/src/lib/libc/port/gen/sysconf.c | 4 | ||||
-rw-r--r-- | usr/src/lib/libc/port/llib-lc | 10 | ||||
-rw-r--r-- | usr/src/lib/libc/port/mapfile-vers | 9 |
4 files changed, 121 insertions, 25 deletions
diff --git a/usr/src/lib/libc/port/gen/getlogin.c b/usr/src/lib/libc/port/gen/getlogin.c index a3d7b4cf3b..036ed4da49 100644 --- a/usr/src/lib/libc/port/gen/getlogin.c +++ b/usr/src/lib/libc/port/gen/getlogin.c @@ -20,6 +20,8 @@ */ /* + * Copyright (c) 2013 Gary Mills + * * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -27,10 +29,8 @@ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ -#pragma ident "%Z%%M% %I% %E% SMI" - -#pragma weak _getlogin = getlogin -#pragma weak _getlogin_r = getlogin_r +#pragma weak _getlogin = getloginx +#pragma weak _getlogin_r = getloginx_r #include "lint.h" #include <sys/types.h> @@ -47,28 +47,42 @@ #include <mtlib.h> #include "tsd.h" +/* Revert the renames done in unistd.h */ +#ifdef __PRAGMA_REDEFINE_EXTNAME +#pragma redefine_extname getlogint getlogin +#pragma redefine_extname getlogint_r getlogin_r +#pragma redefine_extname __posix_getlogint_r __posix_getlogin_r +#else /* __PRAGMA_REDEFINE_EXTNAME */ +#ifdef getlogin +#undef getlogin +#endif /* getlogin */ +#ifdef getlogin_r +#undef getlogin_r +#endif /* getlogin_r */ +#ifdef __posix_getlogin_r +#undef __posix_getlogin_r +#endif /* __posix_getlogin_r */ +#define getlogint getlogin +#define getlogint_r getlogin_r +#define __posix_getlogint_r __posix_getlogin_r +#endif /* __PRAGMA_REDEFINE_EXTNAME */ + /* - * XXX - _POSIX_LOGIN_NAME_MAX limits the length of a login name. The utmpx - * interface provides for a 32 character login name, but for the sake of - * compatibility, we are still using the old utmp-imposed limit. + * Use the full length of a login name. + * The utmpx interface provides for a 32 character login name. */ +#define NMAX (sizeof (((struct utmpx *)0)->ut_user)) /* - * POSIX.1c Draft-6 version of the function getlogin_r. - * It was implemented by Solaris 2.3. + * Common function */ -char * -getlogin_r(char *answer, int namelen) +static char * +getl_r_common(char *answer, size_t namelen, size_t maxlen) { int uf; off64_t me; struct futmpx ubuf; - if (namelen < _POSIX_LOGIN_NAME_MAX) { - errno = ERANGE; - return (NULL); - } - if ((me = (off64_t)ttyslot()) < 0) return (NULL); if ((uf = open64(UTMPX_FILE, 0)) < 0) @@ -81,24 +95,82 @@ getlogin_r(char *answer, int namelen) (void) close(uf); if (ubuf.ut_user[0] == '\0') return (NULL); - (void) strncpy(&answer[0], &ubuf.ut_user[0], - _POSIX_LOGIN_NAME_MAX - 1); - answer[_POSIX_LOGIN_NAME_MAX - 1] = '\0'; + + /* Insufficient buffer size */ + if (namelen < strnlen(&ubuf.ut_user[0], maxlen)) { + errno = ERANGE; + return (NULL); + } + (void) strncpy(&answer[0], &ubuf.ut_user[0], maxlen); + answer[maxlen] = '\0'; return (&answer[0]); } /* + * POSIX.1c Draft-6 version of the function getlogin_r. + * It was implemented by Solaris 2.3. + */ +char * +getlogint_r(char *answer, int namelen) +{ + return (getl_r_common(answer, (size_t)namelen, LOGNAME_MAX_TRAD)); +} + +/* + * POSIX.1c standard version of the function getlogin_r. + * User gets it via static getlogin_r from the header file. + */ +int +__posix_getlogint_r(char *name, int namelen) +{ + int nerrno = 0; + int oerrno = errno; + + errno = 0; + if (getl_r_common(name, (size_t)namelen, LOGNAME_MAX_TRAD) == NULL) { + if (errno == 0) + nerrno = EINVAL; + else + nerrno = errno; + } + errno = oerrno; + return (nerrno); +} + +char * +getlogint(void) +{ + char *answer = tsdalloc(_T_LOGIN, LOGIN_NAME_MAX_TRAD, NULL); + + if (answer == NULL) + return (NULL); + return (getl_r_common(answer, LOGIN_NAME_MAX_TRAD, LOGNAME_MAX_TRAD)); +} + +/* + * POSIX.1c Draft-6 version of the function getlogin_r. + * It was implemented by Solaris 2.3. + * For extended login names, selected by redefine_extname in unistd.h. + */ +char * +getloginx_r(char *answer, int namelen) +{ + return (getl_r_common(answer, (size_t)namelen, NMAX)); +} + +/* * POSIX.1c standard version of the function getlogin_r. * User gets it via static getlogin_r from the header file. + * For extended login names, selected by redefine_extname in unistd.h. */ int -__posix_getlogin_r(char *name, int namelen) +__posix_getloginx_r(char *name, int namelen) { int nerrno = 0; int oerrno = errno; errno = 0; - if (getlogin_r(name, namelen) == NULL) { + if (getl_r_common(name, (size_t)namelen, NMAX) == NULL) { if (errno == 0) nerrno = EINVAL; else @@ -108,12 +180,15 @@ __posix_getlogin_r(char *name, int namelen) return (nerrno); } +/* + * For extended login names, selected by redefine_extname in unistd.h. + */ char * -getlogin(void) +getloginx(void) { - char *answer = tsdalloc(_T_LOGIN, _POSIX_LOGIN_NAME_MAX, NULL); + char *answer = tsdalloc(_T_LOGIN, LOGIN_NAME_MAX, NULL); if (answer == NULL) return (NULL); - return (getlogin_r(answer, _POSIX_LOGIN_NAME_MAX)); + return (getl_r_common(answer, LOGIN_NAME_MAX, NMAX)); } diff --git a/usr/src/lib/libc/port/gen/sysconf.c b/usr/src/lib/libc/port/gen/sysconf.c index 8c2e6f4eb2..8e852ce1c8 100644 --- a/usr/src/lib/libc/port/gen/sysconf.c +++ b/usr/src/lib/libc/port/gen/sysconf.c @@ -20,6 +20,8 @@ */ /* + * Copyright (c) 2013 Gary Mills + * * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -372,7 +374,7 @@ sysconf(int name) return ((long)NSS_BUFLEN_PASSWD); case _SC_LOGIN_NAME_MAX: - return ((long)(LOGNAME_MAX + 1)); + return ((long)(LOGIN_NAME_MAX)); case _SC_THREAD_KEYS_MAX: return (-1L); diff --git a/usr/src/lib/libc/port/llib-lc b/usr/src/lib/libc/port/llib-lc index 1781f34b2b..eb2fb4357b 100644 --- a/usr/src/lib/libc/port/llib-lc +++ b/usr/src/lib/libc/port/llib-lc @@ -23,6 +23,7 @@ * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright 2013 OmniTI Computer Consulting, Inc. All rights reserved. + * Copyright (c) 2013 Gary Mills */ /* LINTLIBRARY */ @@ -194,6 +195,7 @@ char *__posix_asctime_r(const struct tm *_RESTRICT_KYWD, char *_RESTRICT_KYWD); char *__posix_ctime_r(const time_t *, char *); int __posix_ttyname_r(int, char *, size_t); int __posix_getlogin_r(char *, int); +int __posix_getloginx_r(char *, int); /* * XPG4 versions of standard libc routines; these aren't extracted @@ -477,7 +479,15 @@ int gethz(void); uint_t getisax(uint32_t *, uint_t); /* getlogin.c */ +char *getloginx(void); +char *getloginx_r(char *, int); +#ifdef getlogin +#undef getlogin +#endif /* getlogin */ char *getlogin(void); +#ifdef getlogin_r +#undef getlogin_r +#endif /* getlogin_r */ char *getlogin_r(char *, int); /* getmntent.c */ diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers index d6907e359d..c30ed85d24 100644 --- a/usr/src/lib/libc/port/mapfile-vers +++ b/usr/src/lib/libc/port/mapfile-vers @@ -26,6 +26,8 @@ # # Copyright (c) 2012 by Delphix. All rights reserved. # Copyright (c) 2013, OmniTI Computer Consulting, Inc. All rights reserved. +# Copyright (c) 2013 Gary Mills +# # # MAPFILE HEADER START @@ -90,6 +92,13 @@ $if _x86 && _ELF64 $add amd64 $endif +SYMBOL_VERSION ILLUMOS_0.6 { # Illumos additions + protected: + getloginx; + getloginx_r; + __posix_getloginx_r; +} ILLUMOS_0.5; + SYMBOL_VERSION ILLUMOS_0.5 { # common C++ ABI exit handlers protected: __cxa_atexit; |