summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMats Erik Andersson <mats.andersson@gisladisker.se>2012-09-05 22:08:37 +0200
committerEric Blake <eblake@redhat.com>2012-09-05 15:19:04 -0600
commit8a8ef57118fa76ee06d57715f997332a8d3488ec (patch)
tree4c90ea797f4bac6f8d47b6cdde80eff3b6cabb60
parent0815daf810f59e2da6778367a2000bdd25af71b4 (diff)
downloadgnulib-8a8ef57118fa76ee06d57715f997332a8d3488ec.tar.gz
readutmp: fix non-portable UT_PID use
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.
-rw-r--r--ChangeLog6
-rw-r--r--lib/readutmp.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0874c81464..dea1f86675 100644
--- 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
diff --git a/lib/readutmp.c b/lib/readutmp.c
index f89dd68fe6..ef6277a680 100644
--- a/lib/readutmp.c
+++ b/lib/readutmp.c
@@ -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;
}