svn commit: r201662 - user/ed/utmpx/lib/libc/gen

Ed Schouten ed at FreeBSD.org
Wed Jan 6 20:04:37 UTC 2010


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);
 }


More information about the svn-src-user mailing list