From: nekral-guest Date: Sun, 15 Jun 2008 19:15:15 +0000 (+0000) Subject: * libmisc/log.c: Check return values. If lseek() failed, avoid X-Git-Tag: 4.1.3~343 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68cdac68cba5f62929538cea013608d5869c2b8d;p=shadow * 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. --- diff --git a/ChangeLog b/ChangeLog index c3b25f85..93b1e5fd 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 35a21953..bc7eb88f 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); }