From: Javier Martinez Canillas Date: Mon, 9 Jan 2023 23:30:44 +0000 (-0500) Subject: normal/main: Discover the device to read the config from as a fallback X-Git-Tag: archive/raspbian/2.12-8+rpi1^2~100 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8cdf93afdcf16ba14590a856fb24d55899bb79e9;p=grub2.git normal/main: Discover the device to read the config from as a fallback When core.img is generated locally, the grub2-probe tool figures out the device and partition that needs to be read to parse the GRUB configuration file. But in some cases the core.img can't be generated on the host and instead has to be done at package build time. In particular, this will be true when it needs to be signed with a key that's only available on the package building infrastructure. In that case, the prefix variable won't have a device and partition but only a directory path. So there's no way for GRUB to know from which device has to read the configuration file. To allow GRUB to continue working on that scenario, fallback to iterating over all the available devices if reading the config failed when using the prefix and fw_path variables. Signed-off-by: Javier Martinez Canillas Co-authored-by: Robbie Harwood Signed-off-by: Robbie Harwood Gbp-Pq: Topic network Gbp-Pq: Name discover-the-device-to-read-the-config-from-as-fallback.patch --- diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c index 28decc6..74ed468 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -311,18 +311,13 @@ grub_enter_normal_mode (const char *config) } static grub_err_t -grub_try_normal (const char *variable) +grub_try_normal_prefix (const char *prefix) { char *config; - const char *prefix; grub_err_t err = GRUB_ERR_FILE_NOT_FOUND; const char *net_search_cfg; int disable_net_search = 0; - prefix = grub_env_get (variable); - if (!prefix) - return GRUB_ERR_FILE_NOT_FOUND; - net_search_cfg = grub_env_get ("feature_net_search_cfg"); if (net_search_cfg && net_search_cfg[0] == 'n') disable_net_search = 1; @@ -336,7 +331,7 @@ grub_try_normal (const char *variable) config = grub_malloc (config_len); if (! config) - return GRUB_ERR_FILE_NOT_FOUND; + return err; grub_snprintf (config, config_len, "%s/grub.cfg", prefix); err = grub_net_search_config_file (config); @@ -365,6 +360,53 @@ grub_try_normal (const char *variable) return err; } +static int +grub_try_normal_dev (const char *name, void *data) +{ + grub_err_t err; + const char *prefix = grub_xasprintf ("(%s)%s", name, (char *) data); + + if (!prefix) + return 0; + + err = grub_try_normal_prefix (prefix); + if (err == GRUB_ERR_NONE) + return 1; + + return 0; +} + +static grub_err_t +grub_try_normal_discover (void) +{ + const char *prefix = grub_env_get ("prefix"); + grub_err_t err = GRUB_ERR_FILE_NOT_FOUND; + + if (!prefix) + return err; + + if (grub_device_iterate (grub_try_normal_dev, (void *) prefix)) + return GRUB_ERR_NONE; + + return err; +} + +static grub_err_t +grub_try_normal (const char *variable) +{ + grub_err_t err = GRUB_ERR_FILE_NOT_FOUND; + const char *prefix; + + if (!variable) + return err; + + prefix = grub_env_get (variable); + if (!prefix) + return err; + + return grub_try_normal_prefix (prefix); +} + /* Enter normal mode from rescue mode. */ static grub_err_t grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), @@ -379,6 +421,8 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), err = grub_try_normal ("fw_path"); if (err == GRUB_ERR_FILE_NOT_FOUND) err = grub_try_normal ("prefix"); + if (err == GRUB_ERR_FILE_NOT_FOUND) + err = grub_try_normal_discover (); if (err == GRUB_ERR_FILE_NOT_FOUND) grub_enter_normal_mode (0); }