On Thu, May 29, 2025 at 6:59 AM, Avnish Chouhan <[email protected]> wrote:
> On 2025-05-21 18:21, [email protected] wrote:
[...]
> > +static grub_err_t
> > +blsuki_add_keyval (grub_blsuki_entry_t *entry, char *key, char *val)
> > +{
> > + char *k, *v;
> > + struct keyval **kvs, *kv;
> > + grub_size_t size;
> > + int new_n = entry->nkeyvals + 1;
> > +
> > + if (entry->keyvals_size == 0)
> > + {
> > + size = sizeof (struct keyval *);
> > + kvs = grub_malloc (size);
> > + if (kvs == NULL)
> > + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't allocate space
> > for BLS key values");
>
> Hi Alec,
>
> Indentation seems off here!
Hi Avnish,
The reason the indentations looks strange here and through out the patches is
because those are spots where more than 8 spaces were used. In those cases, a
tab is used in the GRUB code. Unfortunately, the formatting of the patch makes
it look strange.
[...]
> > +static grub_err_t
> > +bls_parse_keyvals (grub_file_t f, grub_blsuki_entry_t *entry)
> > +{
> > + grub_err_t err = GRUB_ERR_NONE;
> > +
> > + for (;;)
> > + {
> > + char *buf;
> > + char *separator;
> > +
> > + buf = grub_file_getline (f);
> > + if (buf == NULL)
> > + break;
>
> Indentation seems off!
>
> > +
> > + while (buf != NULL && buf[0] != '\0' && (buf[0] == ' ' ||
> > buf[0] == '\t'))
> > + buf++;
>
> Indentation seems off!
>
> > + if (buf[0] == '#')
> > + {
> > + grub_free (buf);
> > + continue;
> > + }
>
> Indentation seems off in if condition!
>
> > +
> > + separator = grub_strchr (buf, ' ');
> > +
> > + if (separator == NULL)
> > + separator = grub_strchr (buf, '\t');
>
> Indentation seems off!
>
> > +
> > + if (separator == NULL || separator[1] == '\0')
> > + {
> > + grub_free (buf);
> > + break;
> > + }
>
> Indentation seems off in if condition!
>
> > +
> > + separator[0] = '\0';
> > +
> > + do
> > + {
> > + separator++;
> > + }
>
> Indentation seems off!
>
> > + while (*separator == ' ' || *separator == '\t');
>
> What's the use of this while condition? It may result in an infinite
> loop...
>
The purpose of this while loop is to remove any additional spaces or tabs
separating the key from the value. I don't believe this would result in an
infinite loop unless the rest of memory was a space or tab. However, an issue
I do see is we aren't checking if there is a value after removing the excess
spaces and tabs in the loop. I'll fix this.
> > +
> > + err = blsuki_add_keyval (entry, buf, separator);
> > + grub_free (buf);
> > + if (err != GRUB_ERR_NONE)
> > + break;
>
> Indentation seems off!
>
> > + }
> > +
> > + return err;
> > +}
[...]
> > +static char *
> > +blsuki_field_append (bool is_env_var, char *buffer, const char
> > *start, const char *end)
> > +{
> > + char *tmp;
> > + const char *field;
> > + int term = (is_env_var == true) ? 2 : 1;
> > + grub_size_t size = 0;
> > +
> > + tmp = grub_strndup (start, end - start + 1);
> > + if (tmp == NULL)
> > + return NULL;
> > +
> > + field = tmp;
> > +
> > + if (is_env_var == true)
> > + {
> > + field = grub_env_get (tmp);
> > + if (field == NULL)
> > + return buffer;
> > + }
> > +
> > + if (grub_add (grub_strlen (field), term, &size))
> > + return NULL;
> > +
> > + if (buffer == NULL)
> > + buffer = grub_zalloc (size);
> > + else
> > + {
> > + if (grub_add (size, grub_strlen (buffer), &size))
> > + return NULL;
>
> Indentation seems off!
> Adding one new line would be good here!
Sure thing!
>
> > + buffer = grub_realloc (buffer, size);
> > + }
> > +
> > + if (buffer == NULL)
> > + return NULL;
> > +
> > + tmp = buffer + grub_strlen (buffer);
> > + tmp = grub_stpcpy (tmp, field);
> > +
> > + if (is_env_var == true)
> > + tmp = grub_stpcpy (tmp, " ");
> > +
> > + return buffer;
> > +}
> > +
> > +/*
> > + * This function takes a value string, checks for environmental
> > variables, and
> > + * returns the value string with all environmental variables replaced
> > with the
> > + * value stored in the variable.
> > + */
> > +static char *
> > +blsuki_expand_val (const char *value)
> > +{
> > + char *buffer = NULL;
> > + const char *start = value;
> > + const char *end = value;
> > + bool is_env_var = false;
> > +
> > + if (value == NULL)
> > + return NULL;
> > +
> > + while (*value != '\0')
> > + {
> > + if (*value == '$')
> > + {
> > + if (start != end)
> > + {
> > + buffer = blsuki_field_append (is_env_var, buffer, start, end);
> > + if (buffer == NULL)
> > + return NULL;
> > + }
> > +
> > + is_env_var = true;
> > + start = value + 1;
> > + }
> > + else if (is_env_var == true)
> > + {
> > + if (grub_isalnum (*value) == 0 && *value != '_')
> > + {
> > + buffer = blsuki_field_append (is_env_var, buffer, start, end);
> > + is_env_var = false;
> > + start = value;
> > + if (*start == ' ')
> > + start++;
> > + }
> > + }
>
> Indentation seems off in "if (*value == '$')" and else if conditions.
> Missing else condition in if else ladder. Adding it would be good!
I don't believe an else condition would be necessary since there isn't any code
that needs to be done exclusive of both these conditionals.
>
> > +
> > + end = value;
> > + value++;
> > + }
> > +
> > + if (start != end)
> > + {
> > + buffer = blsuki_field_append (is_env_var, buffer, start, end);
> > + if (buffer == NULL)
> > + return NULL;
>
> Indentation seems off!
>
> > + }
> > +
> > + return buffer;
> > +}
> > +
> > +/*
> > + * This function parses a string containing initrd paths and returns
> > it as a
> > + * list.
> > + */
> > +static char **
> > +blsuki_early_initrd_list (const char *initrd)
> > +{
> > + int nlist = 0;
> > + char **list = NULL;
> > + const char *separator = initrd;
> > + char *tmp;
> > +
> > + for (;;)
> > + {
> > + while (*separator != '\0' && *separator != ' ' && *separator !=
> > '\t')
> > + separator++;
>
> Indentation seems off!
>
> > + if (*separator == '\0')
> > + break;
>
> Indentation seems off!
>
> > +
> > + list = grub_realloc (list, (nlist + 2) * sizeof (char *));
>
> Good to use grub_malloc here!
If list is NULL, grub_realloc() will call grub_malloc(), but I'll take a look
to see if there is a possibility to only call grub_malloc() once before the
loop so we don't keep calling grub_realloc().
>
> > + if (list == NULL)
> > + return NULL;
>
> Indentation seems off!
>
> > +
> > + tmp = grub_strndup (initrd, separator - initrd);
> > + if (tmp == NULL)
> > + {
> > + grub_free (list);
> > + return NULL;
> > + }
>
> Indentation seems off in if condition!
>
> > + list[nlist++] = tmp;
> > + list[nlist] = NULL;
> > + separator++;
> > + initrd = separator;
> > + }
> > +
> > + list = grub_realloc (list, (nlist + 2) * sizeof (char *));
> > + if (list == NULL)
> > + return NULL;
> > +
> > + tmp = grub_strndup (initrd, grub_strlen (initrd));
> > + if (tmp == NULL)
> > + {
> > + grub_free (list);
> > + return NULL;
> > + }
> > + list[nlist++] = tmp;
> > + list[nlist] = NULL;
> > +
> > + return list;
> > +}
[...]
> > +static char *
> > +bls_get_devicetree (grub_blsuki_entry_t *entry)
> > +{
> > + char *dt_path;
> > + char *dt_cmd = NULL;
> > + char *tmp;
> > + char *linux_path;
> > + char *slash;
> > + char *prefix = NULL;
> > + grub_size_t prefix_len = 0;
> > + grub_size_t size;
> > + bool add_dt_prefix = false;
> > +
> > + dt_path = blsuki_expand_val (blsuki_get_val (entry, "devicetree",
> > NULL));
> > +
> > + if (dt_path == NULL)
> > + {
> > + dt_path = blsuki_expand_val (grub_env_get ("devicetree"));
> > + add_dt_prefix = true;
> > + }
> > +
> > + if (dt_path != NULL)
> > + {
> > + if (add_dt_prefix == true)
> > + {
>
> Indentation seems off!
>
> > + linux_path = blsuki_get_val (entry, "linux", NULL);
> > + slash = grub_strchr (linux_path, '/');
> > + if (slash != NULL)
> > + prefix_len = slash - linux_path + 1;
>
> Adding a new line here would be good!
Sure thing!
>
>
> > + prefix = grub_strndup (linux_path, prefix_len);
> > + if (prefix == NULL)
> > + {
> > + grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("failed to allocate
> > prefix buffer"));
> > + goto finish;
> > + }
> > + }
> > +
> > + if (grub_add (grub_strlen ("devicetree "), grub_strlen
> > (dt_path), &size) ||
> > + grub_add (size, 1, &size))
>
> Indentation seems off!
>
> > + {
>
> Indentation seems off!
>
> > + grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow detected calculating
> > device tree buffer size");
> > + goto finish;
> > + }
> > +
> > + if (add_dt_prefix == true)
> > + {
>
> Indentation seems off!
>
> > + if (grub_add (size, grub_strlen (prefix), &size))
> > + {
> > + grub_error (GRUB_ERR_OUT_OF_RANGE, "overflow detected
> > calculating device tree buffer size");
> > + goto finish;
> > + }
> > + }
> > + dt_cmd = grub_malloc (size);
> > + if (dt_cmd == NULL)
> > + goto finish;
>
> Indentation seems off! and anding a new line would be good!
Sure thing!
>
> > + tmp = dt_cmd;
> > + tmp = grub_stpcpy (dt_cmd, "devicetree");
> > + tmp = grub_stpcpy (tmp, " ");
> > + if (add_dt_prefix == true)
> > + tmp = grub_stpcpy (tmp, prefix);
>
> Adding a new line would be good!
>
> > + tmp = grub_stpcpy (tmp, dt_path);
> > + tmp = grub_stpcpy (tmp, "\n");
> > + }
> > +
> > + finish:
> > + grub_free (prefix);
> > +
> > + return dt_cmd;
> > +}
> > +
> > +/*
> > + * This function puts together all of the commands generated from the
> > contents
> > + * of the BLS config file and creates a new entry in the GRUB boot
> > menu.
> > + */
> > +static void
> > +bls_create_entry (grub_blsuki_entry_t *entry)
> > +{
> > + int argc = 0;
> > + const char **argv = NULL;
> > + char *title = NULL;
> > + char *linux_path = NULL;
> > + char *linux_cmd = NULL;
> > + char *initrd_cmd = NULL;
> > + char *dt_cmd = NULL;
> > + char *id = entry->filename;
> > + grub_size_t id_len;
> > + char *hotkey = NULL;
> > + char *users = NULL;
> > + char **classes = NULL;
> > + char **args = NULL;
> > + char *src = NULL;
> > + const char *sdval = NULL;
> > + int i;
> > + grub_size_t size;
> > + bool savedefault;
> > +
> > + linux_path = blsuki_get_val (entry, "linux", NULL);
> > + if (linux_path == NULL)
> > + {
> > + grub_dprintf ("blsuki", "Skipping file %s with no 'linux'
> > key.\n", entry->filename);
> > + goto finish;
> > + }
> > +
> > + id_len = grub_strlen (id);
> > + if (id_len >= 5 && grub_strcmp (id + id_len - 5, ".conf") == 0)
> > + id[id_len - 5] = '\0';
> > +
> > + title = blsuki_get_val (entry, "title", NULL);
> > + hotkey = blsuki_get_val (entry, "grub_hotkey", NULL);
> > + users = blsuki_expand_val (blsuki_get_val (entry, "grub_users",
> > NULL));
> > + classes = blsuki_make_list (entry, "grub_class", NULL);
> > + args = blsuki_make_list (entry, "grub_arg", &argc);
> > +
> > + argc++;
> > + if (grub_mul (argc + 1, sizeof (char *), &size))
> > + {
> > + grub_error (GRUB_ERR_OUT_OF_RANGE, N_("overflow detected
> > creating argv list"));
> > + goto finish;
> > + }
> > +
> > + argv = grub_malloc (size);
> > + if (argv == NULL)
> > + goto finish;
>
> Adding a new line would be good!
Sure thing!
>
> > + argv[0] = title ? title : linux_path;
> > + for (i = 1; i < argc; i++)
> > + argv[i] = args[i-1];
>
> Adding a new line would be good!
Sure thing!
>
> > + argv[argc] = NULL;
> > +
> > + linux_cmd = bls_get_linux (entry);
> > + if (linux_cmd == NULL)
> > + goto finish;
> > +
> > + initrd_cmd = bls_get_initrd (entry);
> > + if (grub_errno != GRUB_ERR_NONE)
> > + goto finish;
> > +
> > + dt_cmd = bls_get_devicetree (entry);
> > + if (grub_errno != GRUB_ERR_NONE)
> > + goto finish;
> > +
> > + sdval = grub_env_get ("save_default");
> > + savedefault = ((NULL != sdval) && (grub_strcmp (sdval, "true") ==
> > 0));
> > + src = grub_xasprintf ("%s%s%s%s",
> > + savedefault ? "savedefault\n" : "",
> > + linux_cmd, initrd_cmd ? initrd_cmd : "",
> > + dt_cmd ? dt_cmd : "");
>
> Indentation seems off!
>
> > +
> > + grub_normal_add_menu_entry (argc, argv, classes, id, users, hotkey,
> > NULL, src, 0, entry);
> > +
> > + finish:
> > + grub_free (linux_cmd);
> > + grub_free (dt_cmd);
> > + grub_free (initrd_cmd);
> > + grub_free (classes);
> > + grub_free (args);
> > + grub_free (argv);
> > + grub_free (src);
> > +}
[...]
> > +static grub_err_t
> > +blsuki_load_entries (char *path, bool enable_fallback)
> > +{
> > + grub_size_t len;
> > + static grub_err_t r;
> > + const char *devid = NULL;
> > + char *dir = NULL;
> > + struct find_entry_info info = {
> > + .dev = NULL,
> > + .fs = NULL,
> > + .dirname = NULL,
> > + };
> > + struct read_entry_info rei = {
> > + .devid = NULL,
> > + .dirname = NULL,
> > + };
> > +
> > + if (path != NULL)
> > + {
> > + len = grub_strlen (path);
> > + if (len >= 5 && grub_strcmp (path + len - 5, ".conf") == 0)
> > + {
> > + rei.file = grub_file_open (path, GRUB_FILE_TYPE_CONFIG);
> > + if (rei.file == NULL)
> > + return grub_errno;
> > +
> > + /* blsuki_read_entry() closes the file. */
> > + return blsuki_read_entry (path, NULL, &rei);
> > + }
> > + else if (path[0] == '(')
> > + {
> > + devid = path + 1;
> > +
> > + dir = grub_strchr (path, ')');
> > + if (dir == NULL)
> > + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid file name
> > `%s'"), path);
> > +
> > + *dir = '\0';
> > +
> > + /* Check if there is more than the devid in the path. */
> > + if (dir + 1 < path + len)
> > + dir = dir + 1;
> > + }
> > + else if (path[0] == '/')
> > + dir = path;
> > + }
>
> Indentation seems off in if else ladder! adding else condition would be
> good!
Same as before, I don't think there is any code that would require an else
condition here.
>
> > +
> > + if (dir == NULL)
> > + dir = (char *) GRUB_BLS_CONFIG_PATH;
> > +
> > + r = blsuki_set_find_entry_info (&info, dir, devid);
> > + if (r == GRUB_ERR_NONE)
> > + blsuki_find_entry (&info, enable_fallback);
> > +
> > + if (info.dev != NULL)
> > + grub_device_close (info.dev);
> > +
> > + return r;
> > +}
[...]
> > diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
> > index 04d058f55..2d493f21e 100644
> > --- a/grub-core/normal/main.c
> > +++ b/grub-core/normal/main.c
> > @@ -21,6 +21,7 @@
> > #include <grub/net.h>
> > #include <grub/normal.h>
> > #include <grub/dl.h>
> > +#include <grub/menu.h>
> > #include <grub/misc.h>
> > #include <grub/file.h>
> > #include <grub/mm.h>
> > @@ -67,6 +68,11 @@ grub_normal_free_menu (grub_menu_t menu)
> > grub_free (entry->args);
> > }
> >
> > + if (entry->blsuki)
> > + {
> > + entry->blsuki->visible = 0;
> > + }
>
> Brackets not required!
Sure thing! I'll fix this!
>
> Alec , I see many Indentation issues. I have tried pointing out as much
> as I can. Please fix!
> Thank you!
>
> Regards,
> Avnish Chouhan
>
Thanks for taking a look at these patches!
Alec Brown
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel