mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
ldconfig: Sync temporary files to disk before renaming them [BZ #20890]
If the system crashes before the file data has been written to disk, the file system recovery upon the next mount may restore a partially rewritten temporary file under the non-temporary (final) name (after the rename operation).
This commit is contained in:
parent
52a01100ad
commit
999a6dab3e
@ -1,3 +1,11 @@
|
||||
2018-02-21 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #20890]
|
||||
* elf/cache.c (save_cache): Call fsync on temporary file before
|
||||
renaming it.
|
||||
(save_aux_cache): Call fdatasync on temporary file before renaming
|
||||
it.
|
||||
|
||||
2018-02-21 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #22787]
|
||||
|
10
elf/cache.c
10
elf/cache.c
@ -454,8 +454,7 @@ save_cache (const char *cache_name)
|
||||
error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
|
||||
}
|
||||
|
||||
if (write (fd, strings, total_strlen) != (ssize_t) total_strlen
|
||||
|| close (fd))
|
||||
if (write (fd, strings, total_strlen) != (ssize_t) total_strlen)
|
||||
error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
|
||||
|
||||
/* Make sure user can always read cache file */
|
||||
@ -464,6 +463,10 @@ save_cache (const char *cache_name)
|
||||
_("Changing access rights of %s to %#o failed"), temp_name,
|
||||
S_IROTH|S_IRGRP|S_IRUSR|S_IWUSR);
|
||||
|
||||
/* Make sure that data is written to disk. */
|
||||
if (fsync (fd) != 0 || close (fd) != 0)
|
||||
error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
|
||||
|
||||
/* Move temporary to its final location. */
|
||||
if (rename (temp_name, cache_name))
|
||||
error (EXIT_FAILURE, errno, _("Renaming of %s to %s failed"), temp_name,
|
||||
@ -818,7 +821,8 @@ save_aux_cache (const char *aux_cache_name)
|
||||
|
||||
if (write (fd, file_entries, file_entries_size + total_strlen)
|
||||
!= (ssize_t) (file_entries_size + total_strlen)
|
||||
|| close (fd))
|
||||
|| fdatasync (fd) != 0
|
||||
|| close (fd) != 0)
|
||||
{
|
||||
unlink (temp_name);
|
||||
goto out_fail;
|
||||
|
Loading…
Reference in New Issue
Block a user