2009-10-01 Colin Watson <cjwatson@ubuntu.com>

* util/grub-editenv.c (create_envblk_file): Write new block with a
	.new suffix and then rename it into place, to ensure atomic
	creation.
This commit is contained in:
cjwatson 2009-10-01 18:22:43 +00:00
parent 0e51c3a7d4
commit 50dcabcf94
2 changed files with 15 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2009-10-01 Colin Watson <cjwatson@ubuntu.com>
* 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 <rmh.grub@aybabtu.com> 2009-09-28 Robert Millan <rmh.grub@aybabtu.com>
Do not automatically install headers. Do not automatically install headers.

View file

@ -95,25 +95,31 @@ create_envblk_file (const char *name)
{ {
FILE *fp; FILE *fp;
char *buf; char *buf;
char *namenew;
buf = malloc (DEFAULT_ENVBLK_SIZE); buf = malloc (DEFAULT_ENVBLK_SIZE);
if (! buf) if (! buf)
grub_util_error ("out of memory"); grub_util_error ("out of memory");
fp = fopen (name, "wb"); asprintf (&namenew, "%s.new", name);
fp = fopen (namenew, "wb");
if (! fp) 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); memcpy (buf, GRUB_ENVBLK_SIGNATURE, sizeof (GRUB_ENVBLK_SIGNATURE) - 1);
memset (buf + sizeof (GRUB_ENVBLK_SIGNATURE) - 1, '#', memset (buf + sizeof (GRUB_ENVBLK_SIGNATURE) - 1, '#',
DEFAULT_ENVBLK_SIZE - sizeof (GRUB_ENVBLK_SIGNATURE) + 1); DEFAULT_ENVBLK_SIZE - sizeof (GRUB_ENVBLK_SIGNATURE) + 1);
if (fwrite (buf, 1, DEFAULT_ENVBLK_SIZE, fp) != DEFAULT_ENVBLK_SIZE) 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)); fsync (fileno (fp));
free (buf); free (buf);
fclose (fp); 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 static grub_envblk_t