diff --git a/ChangeLog b/ChangeLog index 501d7838..71db50c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ * lib/commonio.c: Call fsync before closing the backup file. This ensures that the backup file is flushed to the storage medium. + * src/useradd.c: Likewise for the default file, faillog, lastlog, + and mail spool. 2009-03-15 Nicolas François diff --git a/src/useradd.c b/src/useradd.c index cfbe33e2..d14767d0 100644 --- a/src/useradd.c +++ b/src/useradd.c @@ -542,7 +542,9 @@ static int set_defaults (void) * the new file is intact. */ (void) fflush (ofp); - if ((ferror (ofp) != 0) || (fclose (ofp) != 0)) { + if ( (ferror (ofp) != 0) + || (fsync (fileno (ofp)) != 0) + || (fclose (ofp) != 0)) { unlink (new_file); return -1; } @@ -1556,6 +1558,7 @@ static void faillog_reset (uid_t uid) if ( (-1 == fd) || (lseek (fd, offset_uid, SEEK_SET) != offset_uid) || (write (fd, &fl, sizeof (fl)) != (ssize_t) sizeof (fl)) + || (fsync (fd) != 0) || (close (fd) != 0)) { fprintf (stderr, _("%s: failed to reset the faillog entry of UID %lu: %s\n"), @@ -1581,6 +1584,7 @@ static void lastlog_reset (uid_t uid) if ( (-1 == fd) || (lseek (fd, offset_uid, SEEK_SET) != offset_uid) || (write (fd, &ll, sizeof (ll)) != (ssize_t) sizeof (ll)) + || (fsync (fd) != 0) || (close (fd) != 0)) { fprintf (stderr, _("%s: failed to reset the lastlog entry of UID %lu: %s\n"), @@ -1750,6 +1754,7 @@ static void create_mail (void) perror (_("Setting mailbox file permissions")); } + fsync (fd); close (fd); } }