readutmp: fix non-portable UT_PID use
authorMats Erik Andersson <mats.andersson@gisladisker.se>
Wed, 5 Sep 2012 20:08:37 +0000 (22:08 +0200)
committerEric Blake <eblake@redhat.com>
Wed, 5 Sep 2012 21:19:04 +0000 (15:19 -0600)
The module readutmp is broken for the standard use

  read_utmp(..., READ_UTMP_USER_PROCESS | READ_UTMP_CHECK_PIDS)

for all releases of FreeBSD until 8.3, and all OpenBSD ever released.

The reason is that those systems do not provide `utmp.ut_pid', thus
making the macro UT_PID(u) identical to naught, and then turning
the predicate

   UT_PID (u) <= 0

found in desirable_utmp_entry(), into a permanent true clause.
This makes desirable_utmp_entry() discard every legitimate
user's UTMP entry for said BSD releases. NetBSD and DragonflyBSD
are not touched by this malfunction.

Copyright-paperwork-exempt: yes

* lib/readutmp.c (desirable_utmp_entry) <READ_UTMP_CHECK_PIDS>:
  Use `UT_PID (u) > 0' as absolute condition.

ChangeLog
lib/readutmp.c

index 0874c81..dea1f86 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-05  Mats Erik Andersson  <gnu@gisladisker.se>  (tiny change)
+
+       readutmp: fix non-portable UT_PID use
+       * lib/readutmp.c (desirable_utmp_entry) <READ_UTMP_CHECK_PIDS>:
+       Use `UT_PID (u) > 0' as absolute condition.
+
 2012-09-04  Jim Meyering  <meyering@redhat.com>
 
        fts: reduce two or more trailing spaces to just one, usually
index f89dd68..ef6277a 100644 (file)
@@ -69,8 +69,8 @@ desirable_utmp_entry (STRUCT_UTMP const *u, int options)
     return false;
   if ((options & READ_UTMP_CHECK_PIDS)
       && user_proc
-      && (UT_PID (u) <= 0
-          || (kill (UT_PID (u), 0) < 0 && errno == ESRCH)))
+      && 0 < UT_PID (u)
+      && (kill (UT_PID (u), 0) < 0 && errno == ESRCH))
     return false;
   return true;
 }