]> granicus.if.org Git - shadow/commitdiff
* libmisc/log.c: Check return values. If lseek() failed, avoid
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 15 Jun 2008 19:15:15 +0000 (19:15 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 15 Jun 2008 19:15:15 +0000 (19:15 +0000)
reading or writing at an unspecified location. Log to syslog in
case of failure.
* libmisc/log.c: Use the right casts.

ChangeLog
libmisc/log.c

index c3b25f851eeeafa14ea986720511b1d9f894d6e0..93b1e5fd0f8d9e643c1bbce02cb05ff72b873254 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-06-15  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * 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  <nicolas.francois@centraliens.net>
 
        * libmisc/find_new_ids.c, libmisc/find_new_gid.c,
index 35a219533f10b858df6a8abf73e8e2614c6edb3a..bc7eb88fcda377ba4774d452bb27af75ead64410 100644 (file)
@@ -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);
 }