X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Fsession.c;h=56385dd638742ba9fd7028165104e8565cff0778;hp=f9f8fc011b1b27b3098a80cec3364dfa9f2bc910;hb=9e05a25d76b3f83096c661678010320df673df6b;hpb=5bf6b47df03c7d16ffbebfd83d4f0b5fee146dab;ds=sidebyside diff --git a/pppd/session.c b/pppd/session.c index f9f8fc0..56385dd 100644 --- a/pppd/session.c +++ b/pppd/session.c @@ -73,7 +73,9 @@ #include #include #include +#ifdef HAS_SHADOW #include +#endif #include #include #include @@ -176,6 +178,7 @@ session_start(flags, user, passwd, ttyName, msg) bool try_session = 0; #else /* #ifdef USE_PAM */ struct passwd *pw; + char *cbuf; #ifdef HAS_SHADOW struct spwd *spwd; struct spwd *getspnam(); @@ -294,9 +297,11 @@ session_start(flags, user, passwd, ttyName, msg) #else /* #ifdef USE_PAM */ /* - * Use the non-PAM methods directly + * Use the non-PAM methods directly. 'pw' will remain NULL if the user + * has not been authenticated using local UNIX system services. */ + pw = NULL; if ((SESS_AUTH & flags)) { pw = getpwnam(user); @@ -344,8 +349,10 @@ session_start(flags, user, passwd, ttyName, msg) /* * If no passwd, don't let them login if we're authenticating. */ - if (pw->pw_passwd == NULL || strlen(pw->pw_passwd) < 2 - || strcmp(crypt(passwd, pw->pw_passwd), pw->pw_passwd) != 0) + if (pw->pw_passwd == NULL || strlen(pw->pw_passwd) < 2) + return SESSION_FAILED; + cbuf = crypt(passwd, pw->pw_passwd); + if (!cbuf || strcmp(cbuf, pw->pw_passwd) != 0) return SESSION_FAILED; } @@ -362,14 +369,21 @@ session_start(flags, user, passwd, ttyName, msg) logged_in = 1; #if defined(_PATH_LASTLOG) && !defined(USE_PAM) - { + /* + * Enter the user in lastlog only if he has been authenticated using + * local system services. If he has not, then we don't know what his + * UID might be, and lastlog is indexed by UID. + */ + if (pw != NULL) { struct lastlog ll; int fd; + time_t tnow; if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) >= 0) { (void)lseek(fd, (off_t)(pw->pw_uid * sizeof(ll)), SEEK_SET); memset((void *)&ll, 0, sizeof(ll)); - (void)time(&ll.ll_time); + (void)time(&tnow); + ll.ll_time = tnow; (void)strncpy(ll.ll_line, ttyName, sizeof(ll.ll_line)); (void)strncpy(ll.ll_host, ifname, sizeof(ll.ll_host)); (void)write(fd, (char *)&ll, sizeof(ll));