Print this page
2989 Eliminate use of LOGNAME_MAX in ON
1166 useradd have warning with name more 8 chars

*** 18,39 **** * * CDDL HEADER END */ /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* 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 - #include "lint.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> --- 18,39 ---- * * CDDL HEADER END */ /* + * Copyright (c) 2013 Gary Mills + * * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ ! #pragma weak _getlogin = getloginx ! #pragma weak _getlogin_r = getloginx_r #include "lint.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h>
*** 45,76 **** #include <thread.h> #include <synch.h> #include <mtlib.h> #include "tsd.h" /* ! * 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. */ /* ! * POSIX.1c Draft-6 version of the function getlogin_r. ! * It was implemented by Solaris 2.3. */ ! char * ! getlogin_r(char *answer, int namelen) { 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) return (NULL); (void) lseek64(uf, me * sizeof (ubuf), SEEK_SET); --- 45,90 ---- #include <thread.h> #include <synch.h> #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 */ + /* ! * 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)) /* ! * Common function */ ! static char * ! getl_r_common(char *answer, size_t namelen, size_t maxlen) { int uf; off64_t me; struct futmpx ubuf; if ((me = (off64_t)ttyslot()) < 0) return (NULL); if ((uf = open64(UTMPX_FILE, 0)) < 0) return (NULL); (void) lseek64(uf, me * sizeof (ubuf), SEEK_SET);
*** 79,106 **** return (NULL); } (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'; return (&answer[0]); } /* * POSIX.1c standard version of the function getlogin_r. * User gets it via static getlogin_r from the header file. */ int ! __posix_getlogin_r(char *name, int namelen) { int nerrno = 0; int oerrno = errno; errno = 0; ! if (getlogin_r(name, namelen) == NULL) { if (errno == 0) nerrno = EINVAL; else nerrno = errno; } --- 93,135 ---- return (NULL); } (void) close(uf); if (ubuf.ut_user[0] == '\0') return (NULL); ! ! /* 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; }
*** 107,119 **** errno = oerrno; return (nerrno); } char * ! getlogin(void) { ! char *answer = tsdalloc(_T_LOGIN, _POSIX_LOGIN_NAME_MAX, NULL); if (answer == NULL) return (NULL); ! return (getlogin_r(answer, _POSIX_LOGIN_NAME_MAX)); } --- 136,194 ---- 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_getloginx_r(char *name, int namelen) ! { ! int nerrno = 0; ! int oerrno = errno; ! ! errno = 0; ! if (getl_r_common(name, (size_t)namelen, NMAX) == NULL) { ! if (errno == 0) ! nerrno = EINVAL; ! else ! nerrno = errno; ! } ! errno = oerrno; ! return (nerrno); ! } ! ! /* ! * For extended login names, selected by redefine_extname in unistd.h. ! */ ! char * ! getloginx(void) ! { ! char *answer = tsdalloc(_T_LOGIN, LOGIN_NAME_MAX, NULL); ! ! if (answer == NULL) ! return (NULL); ! return (getl_r_common(answer, LOGIN_NAME_MAX, NMAX)); }