From 68cdac68cba5f62929538cea013608d5869c2b8d Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Sun, 15 Jun 2008 19:15:15 +0000 Subject: [PATCH] * libmisc/log.c: Check return values. If lseek() failed, avoid reading or writing at an unspecified location. Log to syslog in case of failure. * libmisc/log.c: Use the right casts. --- ChangeLog | 7 +++++++ libmisc/log.c | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3b25f851..93b1e5fd0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-06-15 Nicolas François + + * libmisc/log.c: Check return values. If lseek() failed, avoid + reading or writing at an unspecified location. Log to syslog in + case of failure. + * libmisc/log.c: Use the right casts. + 2008-06-15 Nicolas François * libmisc/find_new_ids.c, libmisc/find_new_gid.c, diff --git a/libmisc/log.c b/libmisc/log.c index 35a219533..bc7eb88fc 100644 --- a/libmisc/log.c +++ b/libmisc/log.c @@ -72,7 +72,7 @@ dolastlog (struct lastlog *ll, const struct passwd *pw, const char *line, * for this UID. Negative UID's will create problems, but ... */ - offset = (unsigned long) pw->pw_uid * sizeof newlog; + offset = (off_t) pw->pw_uid * sizeof newlog; if (lseek (fd, offset, SEEK_SET) != offset) { close (fd); @@ -85,7 +85,7 @@ dolastlog (struct lastlog *ll, const struct passwd *pw, const char *line, * the way we read the old one in. */ - if (read (fd, (char *) &newlog, sizeof newlog) != (ssize_t) sizeof newlog) { + if (read (fd, (void *) &newlog, sizeof newlog) != (ssize_t) sizeof newlog) { memzero (&newlog, sizeof newlog); } if (NULL != ll) { @@ -99,9 +99,13 @@ dolastlog (struct lastlog *ll, const struct passwd *pw, const char *line, #if HAVE_LL_HOST strncpy (newlog.ll_host, host, sizeof newlog.ll_host); #endif - if (lseek (fd, offset, SEEK_SET) == offset) { - write (fd, (char *) &newlog, sizeof newlog); + if ( (lseek (fd, offset, SEEK_SET) != offset) + || (write (fd, (const void *) &newlog, sizeof newlog) != (ssize_t) sizeof newlog) + || (close (fd) != 0)) { + SYSLOG ((LOG_WARN, + "Can't write lastlog entry for UID %lu in %s.", + (unsigned long) pw->pw_uid, LASTLOG_FILE)); + (void) close (fd); } - close (fd); } -- 2.47.3