diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2008-08-29 17:13:15 +0300 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2008-10-01 14:59:51 -0400 |
commit | 6531968a0b62959633627f9a74a6f19f2741261d (patch) | |
tree | ec8bf1cbc87e975110e5c86cec1062dec3820b65 /dbus/dbus-sysdeps-unix.c | |
parent | 4fb160094526f57a7cc44deb63ba0f2c76f0384f (diff) |
Bug 17352: synchronize the file before renaming
Dbus is doing atomic file updates by copying them, changing
the copy, and re-naming them. However, it does not synchronize
the file before re-naming, which results in corruption in
case of unclean reboots. The reason for this is that file-systems
have write-back cache and they postpone writing data to the media.
This patch adds the missed fsync() for the Unix part. I do
not have windows so cannot provide a windows port fix.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: Colin Walters <walters@verbum.org>
Diffstat (limited to 'dbus/dbus-sysdeps-unix.c')
-rw-r--r-- | dbus/dbus-sysdeps-unix.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index 1e45649f..18b4967b 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -2224,6 +2224,15 @@ _dbus_string_save_to_file (const DBusString *str, total += bytes_written; } + if (fsync(fd)) + { + dbus_set_error (error, _dbus_error_from_errno (errno), + "Could not synchronize file %s: %s", + tmp_filename_c, _dbus_strerror (errno)); + + goto out; + } + if (!_dbus_close (fd, NULL)) { dbus_set_error (error, _dbus_error_from_errno (errno), |