[PATCH 1/1] discover/grub2: Fix behavior of save_env -f
Alan Dunn
amdunn at google.com
Fri Feb 5 10:26:03 AEDT 2016
Hi folks,
It has been a few weeks since I posted my prior patch, so I thought I would
check in and see whether you think it might get looked at in the near
future. Admittedly fixing "save_env -f" was just something I decided to do
when thinking about making the initial changes that I suggested on-list
(fixing the paths that "load_env -f" and "save_env -f" look at), and I
haven't been able to submit a patch for that issue yet, but I think this
patch is useful on its own.
Thanks,
- Alan
On Tue, Jan 12, 2016 at 3:43 PM, Alan Dunn <amdunn at google.com> wrote:
> Currently, "save_env -f" in the GRUB2 parser only works with three
> arguments, which means only commands of the form "save_env -f <path>"
> that save *no* environment variables are allowed.
>
> Allow "save_env -f <path> [<var>]*", making "save_env -f" useful.
>
> Tested:
> Unit test test-grub2-save-env-dash-f tests this change, and the
> remaining unit tests still pass.
>
> Signed-off-by: Alan Dunn <amdunn at google.com>
> ---
> discover/grub2/env.c | 17 ++++++++++++---
> test/parser/Makefile.am | 1 +
> test/parser/test-grub2-save-env-dash-f.c | 37
> ++++++++++++++++++++++++++++++++
> 3 files changed, 52 insertions(+), 3 deletions(-)
> create mode 100644 test/parser/test-grub2-save-env-dash-f.c
>
> diff --git a/discover/grub2/env.c b/discover/grub2/env.c
> index 9de5e9f..a9ef2b9 100644
> --- a/discover/grub2/env.c
> +++ b/discover/grub2/env.c
> @@ -214,6 +214,7 @@ int builtin_save_env(struct grub2_script *script,
> int i, rc, len, siglen;
> char *buf, *envpath;
> const char *envfile;
> + bool using_dash_f = false;
>
> /* we only support local filesystems */
> if (!dev->mounted) {
> @@ -222,9 +223,15 @@ int builtin_save_env(struct grub2_script *script,
> return -1;
> }
>
> - if (argc == 3 && !strcmp(argv[1], "-f"))
> + if (argc >= 2 && !strcmp(argv[1], "-f")) {
> + if (argc < 3) {
> + pb_log("save_env: for -f, need argument\n");
> + return -1;
> + }
> +
> envfile = argv[2];
> - else
> + using_dash_f = true;
> + } else
> envfile = default_envfile;
>
> envpath = talloc_asprintf(script, "%s/%s",
> @@ -241,7 +248,11 @@ int builtin_save_env(struct grub2_script *script,
> if (rc || len < siglen || memcmp(buf, signature, siglen))
> goto err;
>
> - for (i = 1; i < argc; i++) {
> + /* For "-f", skip the "-f <file>" arguments in picking the
> + * variables to save. */
> + i = (using_dash_f ? 3 : 1);
> +
> + for (; i < argc; i++) {
> const char *name, *value;
>
> name = argv[i];
> diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am
> index d69ca7f..dddb472 100644
> --- a/test/parser/Makefile.am
> +++ b/test/parser/Makefile.am
> @@ -28,6 +28,7 @@ parser_TESTS = \
> test/parser/test-grub2-single-line-if \
> test/parser/test-grub2-load-env \
> test/parser/test-grub2-save-env \
> + test/parser/test-grub2-save-env-dash-f \
> test/parser/test-grub2-saved-default \
> test/parser/test-grub2-nondefault-prefix \
> test/parser/test-grub2-f18-ppc64 \
> diff --git a/test/parser/test-grub2-save-env-dash-f.c
> b/test/parser/test-grub2-save-env-dash-f.c
> new file mode 100644
> index 0000000..7d48f67
> --- /dev/null
> +++ b/test/parser/test-grub2-save-env-dash-f.c
> @@ -0,0 +1,37 @@
> +
> +#include <string.h>
> +
> +#include <talloc/talloc.h>
> +
> +#include "parser-test.h"
> +
> +#if 0 /* PARSER_EMBEDDED_CONFIG */
> +hello=world
> +save_env -f env_file hello
> +#endif
> +
> +static const char *envsig = "# GRUB Environment Block\n";
> +
> +void run_test(struct parser_test *test)
> +{
> + const char *env_before, *env_after;
> +
> + /* The environment file must be preallocated */
> +
> + /* The padding at the end of the environment block is the length of
> + * "hello=world\n" */
> + env_before = talloc_asprintf(test, "%s%s", envsig,
> + "############");
> + test_add_file_data(test, test->ctx->device, "/boot/grub/env_file",
> + env_before, strlen(env_before));
> +
> + env_after = talloc_asprintf(test, "%s%s", envsig,
> + "hello=world\n");
> +
> + test_read_conf_embedded(test, "/boot/grub/grub.cfg");
> +
> + test_run_parser(test, "grub2");
> +
> + check_file_contents(test, test->ctx->device, "/boot/grub/env_file",
> + env_after, strlen(env_after));
> +}
> --
> 2.6.0.rc2.230.g3dd15c0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/petitboot/attachments/20160204/33d7c1c4/attachment.html>
More information about the Petitboot
mailing list