diff -ur qpopper3.1.2/popper/pop_apop.c qpopper3.1.2-my/popper/pop_apop.c --- qpopper3.1.2/popper/pop_apop.c Tue Oct 10 17:34:37 2000 +++ qpopper3.1.2-my/popper/pop_apop.c Tue Dec 12 13:05:49 2000 @@ -188,7 +188,7 @@ } #endif /* NONAUTHFILE */ - pw = getpwnam ( p->user ); + pw = p->pw; if ( ( pw == NULL) || ( pw->pw_passwd == NULL ) || ( *pw->pw_passwd == '\0' ) ) { return ( pop_auth_fail ( p, POP_FAILURE, HERE, ERRMSG_PW, p->user ) ); diff -ur qpopper3.1.2/popper/pop_auth.c qpopper3.1.2-my/popper/pop_auth.c --- qpopper3.1.2/popper/pop_auth.c Mon Sep 11 23:12:57 2000 +++ qpopper3.1.2-my/popper/pop_auth.c Tue Dec 12 13:04:10 2000 @@ -342,7 +342,7 @@ /* Blow away everyone who UNIX knows nothing about */ if ( *p->authid && - (((pw = getpwnam (p->user)) == NULL) || (pw->pw_passwd == NULL) + (((pw = p->pw)) == NULL) || (pw->pw_passwd == NULL) || (*pw->pw_passwd == '\0')) ) { #ifdef NOHINT diff -ur qpopper3.1.2/popper/pop_pass.c qpopper3.1.2-my/popper/pop_pass.c --- qpopper3.1.2/popper/pop_pass.c Mon Nov 13 00:18:07 2000 +++ qpopper3.1.2-my/popper/pop_pass.c Tue Dec 12 14:48:55 2000 @@ -1180,7 +1180,7 @@ /* * Look for the user in the password file */ - pwp = getpwnam ( p->user ); + pwp = p->pw; if ( pwp == NULL ) { DEBUG_LOG1 ( p, "User %.128s not in passwd file", p->user ); diff -ur qpopper3.1.2/popper/pop_rpop.c qpopper3.1.2-my/popper/pop_rpop.c --- qpopper3.1.2/popper/pop_rpop.c Fri Aug 18 22:59:10 2000 +++ qpopper3.1.2-my/popper/pop_rpop.c Tue Dec 12 13:03:35 2000 @@ -86,7 +86,7 @@ } #endif - pw = getpwnam ( p->user ); + pw = p->pw; if ( pw == NULL ) { /* "Can't happen" */ DEBUG_LOG1 ( p, "getpwnam returned NULL for user %s", p->user ); return ( pop_msg ( p, POP_FAILURE, HERE, diff -ur qpopper3.1.2/popper/pop_user.c qpopper3.1.2-my/popper/pop_user.c --- qpopper3.1.2/popper/pop_user.c Wed Sep 20 00:03:24 2000 +++ qpopper3.1.2-my/popper/pop_user.c Tue Dec 12 13:01:27 2000 @@ -181,6 +181,11 @@ p->user [ user_name_len ] = 0; strcpy ( p->authid, p->user ); /* userid is also authentication id */ + /* cache passwd struct for use later, this memory gets freed at the end of the session */ + p->pw = getpwnam ( p->user ); + + + #ifdef SCRAM_ONLY return ( pop_auth_fail ( p, POP_FAILURE, HERE, "[AUTH] You must use SCRAM-MD5 authentication " @@ -205,7 +210,8 @@ * access Qpopper with a cleartext password. */ - pw = getpwnam ( p->user ); + pw = p->pw; + if ( ( pw != NULL ) && #ifdef GDBM ( ( db = gdbm_open ( AUTHDB, 512, GDBM_READER, 0, 0 ) ) != NULL ) @@ -335,8 +341,7 @@ if ( p->style != NULL ) *p->style++ = '\0'; if ( p->class == NULL ) { - struct passwd *pwd = getpwnam ( p->user ); - p->class = login_getclass ( pwd ? pwd->pw_class : NULL ); + p->class = login_getclass ( p->pw ? p->pw->pw_class : NULL ); } if ( p->kerberos ) { p->style = login_getstyle ( p->class, "kerberos", "auth-popper" ); diff -ur qpopper3.1.2/popper/popper.c qpopper3.1.2-my/popper/popper.c --- qpopper3.1.2/popper/popper.c Mon Aug 21 23:58:47 2000 +++ qpopper3.1.2-my/popper/popper.c Tue Dec 12 15:12:58 2000 @@ -619,6 +619,11 @@ if ( p->xmitting ) pop_xmit_clean ( p ); + if (p->pw) + { + free(p->pw); + } + #ifndef NOUPDATEONABORT if ( (p->CurrentState != auth1) && (p->CurrentState != auth2) && !pop_updt(p) ) diff -ur qpopper3.1.2/popper/popper.h qpopper3.1.2-my/popper/popper.h --- qpopper3.1.2/popper/popper.h Fri Sep 29 23:39:53 2000 +++ qpopper3.1.2-my/popper/popper.h Tue Dec 12 14:48:29 2000 @@ -528,6 +528,8 @@ #endif /* DRAC_AUTH */ BOOL user_opts; /* process ~/.qpopper-options ? */ + + struct passwd * pw; /* Details retrieve from /etc/passwd (or elsewhere...) */ }; typedef enum { HANGUP, /* SIGHUP */