From 50dcabcf9485c83aef80226ccdd1bb8ebb6d0d04 Mon Sep 17 00:00:00 2001 From: cjwatson Date: Thu, 1 Oct 2009 18:22:43 +0000 Subject: [PATCH] 2009-10-01 Colin Watson * util/grub-editenv.c (create_envblk_file): Write new block with a .new suffix and then rename it into place, to ensure atomic creation. --- ChangeLog | 6 ++++++ util/grub-editenv.c | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 394470abc..b2d1a7085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-10-01 Colin Watson + + * util/grub-editenv.c (create_envblk_file): Write new block with a + .new suffix and then rename it into place, to ensure atomic + creation. + 2009-09-28 Robert Millan Do not automatically install headers. diff --git a/util/grub-editenv.c b/util/grub-editenv.c index 6d1234050..a8dc137c5 100644 --- a/util/grub-editenv.c +++ b/util/grub-editenv.c @@ -95,25 +95,31 @@ create_envblk_file (const char *name) { FILE *fp; char *buf; + char *namenew; buf = malloc (DEFAULT_ENVBLK_SIZE); if (! buf) grub_util_error ("out of memory"); - fp = fopen (name, "wb"); + asprintf (&namenew, "%s.new", name); + fp = fopen (namenew, "wb"); if (! fp) - grub_util_error ("cannot open the file %s", name); + grub_util_error ("cannot open the file %s", namenew); memcpy (buf, GRUB_ENVBLK_SIGNATURE, sizeof (GRUB_ENVBLK_SIGNATURE) - 1); memset (buf + sizeof (GRUB_ENVBLK_SIGNATURE) - 1, '#', DEFAULT_ENVBLK_SIZE - sizeof (GRUB_ENVBLK_SIGNATURE) + 1); if (fwrite (buf, 1, DEFAULT_ENVBLK_SIZE, fp) != DEFAULT_ENVBLK_SIZE) - grub_util_error ("cannot write to the file %s", name); + grub_util_error ("cannot write to the file %s", namenew); fsync (fileno (fp)); free (buf); fclose (fp); + + if (rename (namenew, name) < 0) + grub_util_error ("cannot rename the file %s to %s", namenew, name); + free (namenew); } static grub_envblk_t -- 2.39.5