From owner-svn-src-user@FreeBSD.ORG Wed Jan 6 20:04:37 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 150F41065672; Wed, 6 Jan 2010 20:04:37 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 04EEB8FC1A; Wed, 6 Jan 2010 20:04:37 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o06K4axr025386; Wed, 6 Jan 2010 20:04:36 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o06K4aob025384; Wed, 6 Jan 2010 20:04:36 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <201001062004.o06K4aob025384@svn.freebsd.org> From: Ed Schouten Date: Wed, 6 Jan 2010 20:04:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r201662 - user/ed/utmpx/lib/libc/gen X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jan 2010 20:04:37 -0000 Author: ed Date: Wed Jan 6 20:04:36 2010 New Revision: 201662 URL: http://svn.freebsd.org/changeset/base/201662 Log: Add some checks to time stamps: - Prevent login sessions from ever getting a negative duration. - Don't update lastlogin when the timestamp is lower than the old value. Modified: user/ed/utmpx/lib/libc/gen/pututxline.c Modified: user/ed/utmpx/lib/libc/gen/pututxline.c ============================================================================== --- user/ed/utmpx/lib/libc/gen/pututxline.c Wed Jan 6 19:57:38 2010 (r201661) +++ user/ed/utmpx/lib/libc/gen/pututxline.c Wed Jan 6 20:04:36 2010 (r201662) @@ -136,7 +136,7 @@ found: } static int -utx_active_remove(const struct futx *fu) +utx_active_remove(struct futx *fu) { int fd; struct futx fe; @@ -158,6 +158,15 @@ utx_active_remove(const struct futx *fu) case LOGIN_PROCESS: if (strncmp(fu->fu_id, fe.fu_id, sizeof fe.fu_id) != 0) continue; + + /* + * Prevent login sessions from having a negative + * timespan. + */ + if (fu->fu_tv < fe.fu_tv) + fu->fu_tv = fe.fu_tv; + + /* Terminate session. */ lseek(fd, -sizeof fe, SEEK_CUR); _write(fd, fu, sizeof *fu); lockf(fd, F_ULOCK, 0); @@ -190,12 +199,19 @@ utx_lastlogin_add(const struct futx *fu) return; } while (_read(fd, &fe, sizeof fe) == sizeof fe) { - if (strncmp(fu->fu_user, fe.fu_user, sizeof fe.fu_user) == 0) { - lseek(fd, -sizeof fe, SEEK_CUR); - break; - } + if (strncmp(fu->fu_user, fe.fu_user, sizeof fe.fu_user) != 0) + continue; + + /* Prevent lowering of the time value. */ + if (fu->fu_tv <= fe.fu_tv) + goto done; + + /* Found a previous lastlogin entry for this * user. */ + lseek(fd, -sizeof fe, SEEK_CUR); + break; } _write(fd, fu, sizeof *fu); +done: lockf(fd, F_ULOCK, 0); _close(fd); }