diff --git a/ChangeLog b/ChangeLog index d34a429c..112cbe43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-04-22 Nicolas François + + * lib/defines.h: Define USER_NAME_MAX_LENGTH, based on utmp and + default to 32. + * libmisc/chkname.c: Use USER_NAME_MAX_LENGTH. + * src/login.c: Use USER_NAME_MAX_LENGTH instead of the default 32. + username also needs to be bigger than USER_NAME_MAX_LENGTH because + it has to be nul-terminated. + 2009-04-22 Nicolas François * src/login.c: Use xmalloc() instead of malloc(). diff --git a/lib/defines.h b/lib/defines.h index 9a81e832..9fb706b6 100644 --- a/lib/defines.h +++ b/lib/defines.h @@ -356,4 +356,19 @@ extern char *strerror (); #define MAX(x,y) (((x) > (y)) ? (x) : (y)) #endif +/* Maximum length of usernames */ +#ifdef HAVE_UTMPX_H +# define USER_NAME_MAX_LENGTH (sizeof (((struct utmpx *)NULL)->ut_user)) +#else +# ifdef HAVE_STRUCT_UTMP_UT_USER +# define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_user)) +# else +# ifdef HAVE_STRUCT_UTMP_UT_NAME +# define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_name)) +# else +# define USER_NAME_MAX_LENGTH 32 +# endif +# endif +#endif + #endif /* _DEFINES_H_ */ diff --git a/libmisc/chkname.c b/libmisc/chkname.c index 67c4e3eb..428acc11 100644 --- a/libmisc/chkname.c +++ b/libmisc/chkname.c @@ -77,17 +77,11 @@ static bool is_valid_name (const char *name) bool is_valid_user_name (const char *name) { -#if HAVE_UTMPX_H - struct utmpx ut; -#else - struct utmp ut; -#endif - /* * User names are limited by whatever utmp can * handle. */ - if (strlen (name) > sizeof (ut.ut_user)) { + if (strlen (name) > USER_NAME_MAX_LENGTH) { return false; } diff --git a/src/login.c b/src/login.c index 9aa6fcd0..1fc69a07 100644 --- a/src/login.c +++ b/src/login.c @@ -610,8 +610,9 @@ int main (int argc, char **argv) } #ifdef RLOGIN if (rflg) { - username = xmalloc (32 * sizeof (char)); - if (do_rlogin (hostname, username, 32, term, sizeof term)) { + username = xmalloc (USER_NAME_MAX_LENGTH + 1); + username[USER_NAME_MAX_LENGTH] = '\0'; + if (do_rlogin (hostname, username, USER_NAME_MAX_LENGTH, term, sizeof term)) { preauth_flag = true; } else { free (username); @@ -920,8 +921,9 @@ int main (int argc, char **argv) exit (1); } preauth_flag = false; - username = xmalloc (32); - login_prompt (_("\n%s login: "), username, 32); + username = xmalloc (USER_NAME_MAX_LENGTH + 1); + username[USER_NAME_MAX_LENGTH] = '\0'; + login_prompt (_("\n%s login: "), username, USER_NAME_MAX_LENGTH); if ('\0' == username) { /* Prompt for a new login */