5e5a15872d
The environment block is a preallocated 1024-byte file which serves as persistent storage for environment variables. It has its own format which is sensitive to corruption if an editor does not know how to process it. Besides that the editor may inadvertently change grubenv file size and/or make it sparse which can lead to unexpected results. This patch adds a message to the grubenv file to warn a user against editing it by tools other than grub-editenv. Signed-off-by: Michael Chang <mchang@suse.com> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
70 lines
2.3 KiB
C
70 lines
2.3 KiB
C
/* editenv.c - tool to edit environment block. */
|
|
/*
|
|
* GRUB -- GRand Unified Bootloader
|
|
* Copyright (C) 2008,2009,2010,2013 Free Software Foundation, Inc.
|
|
*
|
|
* GRUB is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* GRUB is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <grub/types.h>
|
|
#include <grub/emu/misc.h>
|
|
#include <grub/util/misc.h>
|
|
#include <grub/util/install.h>
|
|
#include <grub/lib/envblk.h>
|
|
#include <grub/i18n.h>
|
|
#include <grub/emu/hostfile.h>
|
|
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
|
|
#define DEFAULT_ENVBLK_SIZE 1024
|
|
#define GRUB_ENVBLK_MESSAGE "# WARNING: Do not edit this file by tools other than "PACKAGE"-editenv!!!\n"
|
|
|
|
void
|
|
grub_util_create_envblk_file (const char *name)
|
|
{
|
|
FILE *fp;
|
|
char *buf, *pbuf, *namenew;
|
|
|
|
buf = xmalloc (DEFAULT_ENVBLK_SIZE);
|
|
|
|
namenew = xasprintf ("%s.new", name);
|
|
fp = grub_util_fopen (namenew, "wb");
|
|
if (! fp)
|
|
grub_util_error (_("cannot open `%s': %s"), namenew,
|
|
strerror (errno));
|
|
|
|
pbuf = buf;
|
|
memcpy (pbuf, GRUB_ENVBLK_SIGNATURE, sizeof (GRUB_ENVBLK_SIGNATURE) - 1);
|
|
pbuf += sizeof (GRUB_ENVBLK_SIGNATURE) - 1;
|
|
memcpy (pbuf, GRUB_ENVBLK_MESSAGE, sizeof (GRUB_ENVBLK_MESSAGE) - 1);
|
|
pbuf += sizeof (GRUB_ENVBLK_MESSAGE) - 1;
|
|
memset (pbuf , '#',
|
|
DEFAULT_ENVBLK_SIZE - sizeof (GRUB_ENVBLK_SIGNATURE) - sizeof (GRUB_ENVBLK_MESSAGE) + 2);
|
|
|
|
if (fwrite (buf, 1, DEFAULT_ENVBLK_SIZE, fp) != DEFAULT_ENVBLK_SIZE)
|
|
grub_util_error (_("cannot write to `%s': %s"), namenew,
|
|
strerror (errno));
|
|
|
|
|
|
if (grub_util_file_sync (fp) < 0)
|
|
grub_util_error (_("cannot sync `%s': %s"), namenew, strerror (errno));
|
|
free (buf);
|
|
fclose (fp);
|
|
|
|
if (grub_util_rename (namenew, name) < 0)
|
|
grub_util_error (_("cannot rename the file %s to %s"), namenew, name);
|
|
free (namenew);
|
|
}
|