Re: [PATCH v2 1/2] bootmenu: use utf-8 for menu title

2022-05-29 Thread Pali Rohar
On Sunday 29 May 2022 10:37:23 Masahisa Kojima wrote:
> On Sat, 28 May 2022 at 17:37, Heinrich Schuchardt  wrote:
> > On 5/26/22 12:09, Masahisa Kojima wrote:
> > > @@ -183,13 +183,13 @@ static int prepare_bootmenu_entry(struct 
> > > bootmenu_data *menu,
> > >   return -ENOMEM;
> > >
> > >   len = sep-option;
> >
> > %s/sep-option/sep - option/
> 
> OK.
> 
> >
> > > - buf = calloc(1, (len + 1) * sizeof(u16));
> > > + buf = calloc(1, (len + 1));
> > >   entry->title = buf;
> > >   if (!entry->title) {
> > >   free(entry);
> > >   return -ENOMEM;
> > >   }
> > > - utf8_utf16_strncpy(&buf, option, len);
> > > + strncpy(buf, option, len);
> >
> > Instead of two function calls (calloc, strncpy) simply use strdup().
> 
> bootmenu_x format is "[title]=[commands]", title is not the
> NUL-terminated string, so we can not use strdup here.

Usage of C's strncpy() function should be in most cases avoided as when
target buffer does not have enough space this function does not fill
nul-term byte. (Anyway, I do not know if U-Boot implements strncpy()
according to C standard with this trap or not)

But if you already have length of string then you should use memcpy().

> >
> > >
> > >   len = strlen(sep + 1);
> > >   entry->command = malloc(len + 1);
> >
> > Use strdup() here too.
> 
> OK, command is NUL-terminated.
> 
> Thank you for your comment.
> 
> Regards,
> Masahisa Kojima


Re: [PATCH v2 1/2] bootmenu: use utf-8 for menu title

2022-05-28 Thread Masahisa Kojima
On Sat, 28 May 2022 at 17:37, Heinrich Schuchardt  wrote:
>
> On 5/26/22 12:09, Masahisa Kojima wrote:
> > The commit a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
> > changes the bootmenu title type from char to u16(UTF16 string)
> > to support EFI based system. If EFI_LOADER is not enabled,
> > printf("%ls") is not supported, so bootmenu does not appear
> > correctly.
> >
> > This commit changes the type of menu title from u16(UTF16) to
> > utf-8 string and EFI strings is conveted into utf-8.
> >
> > Fixes: a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
> > Signed-off-by: Masahisa Kojima 
> > Tested-by: Pali Rohar 
> > ---
> >
> > (no change since v1)
> >
> >   cmd/bootmenu.c | 36 +---
> >   1 file changed, 21 insertions(+), 15 deletions(-)
> >
> > diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
> > index 8859eebea5..bf88c2127b 100644
> > --- a/cmd/bootmenu.c
> > +++ b/cmd/bootmenu.c
> > @@ -43,7 +43,7 @@ enum boot_type {
> >   struct bootmenu_entry {
> >   unsigned short int num; /* unique number 0 .. MAX_COUNT */
> >   char key[3];/* key identifier of number */
> > - u16 *title; /* title of entry */
> > + char *title;/* title of entry */
> >   char *command;  /* hush command of entry */
> >   enum boot_type type;/* boot type of entry */
> >   u16 bootorder;  /* order for each boot type */
> > @@ -76,7 +76,7 @@ static void bootmenu_print_entry(void *data)
> >   if (reverse)
> >   puts(ANSI_COLOR_REVERSE);
> >
> > - printf("%ls", entry->title);
> > + printf("%s", entry->title);
> >
> >   if (reverse)
> >   puts(ANSI_COLOR_RESET);
> > @@ -170,7 +170,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
> > *menu,
> >   struct bootmenu_entry *iter = *current;
> >
> >   while ((option = bootmenu_getoption(i))) {
> > - u16 *buf;
> > + char *buf;
> >
> >   sep = strchr(option, '=');
> >   if (!sep) {
> > @@ -183,13 +183,13 @@ static int prepare_bootmenu_entry(struct 
> > bootmenu_data *menu,
> >   return -ENOMEM;
> >
> >   len = sep-option;
>
> %s/sep-option/sep - option/

OK.

>
> > - buf = calloc(1, (len + 1) * sizeof(u16));
> > + buf = calloc(1, (len + 1));
> >   entry->title = buf;
> >   if (!entry->title) {
> >   free(entry);
> >   return -ENOMEM;
> >   }
> > - utf8_utf16_strncpy(&buf, option, len);
> > + strncpy(buf, option, len);
>
> Instead of two function calls (calloc, strncpy) simply use strdup().

bootmenu_x format is "[title]=[commands]", title is not the
NUL-terminated string, so we can not use strdup here.

>
> >
> >   len = strlen(sep + 1);
> >   entry->command = malloc(len + 1);
>
> Use strdup() here too.

OK, command is NUL-terminated.

Thank you for your comment.

Regards,
Masahisa Kojima

>
> Best regards
>
> Heinrich
>
> > @@ -227,6 +227,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
> > *menu,
> >   return 1;
> >   }
> >
> > +#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
> >   /**
> >* prepare_uefi_bootorder_entry() - generate the uefi bootmenu entries
> >*
> > @@ -279,13 +280,17 @@ static int prepare_uefi_bootorder_entry(struct 
> > bootmenu_data *menu,
> >   }
> >
> >   if (lo.attributes & LOAD_OPTION_ACTIVE) {
> > - entry->title = u16_strdup(lo.label);
> > - if (!entry->title) {
> > + char *buf;
> > +
> > + buf = calloc(1, utf16_utf8_strlen(lo.label) + 1);
> > + if (!buf) {
> >   free(load_option);
> >   free(entry);
> >   free(bootorder);
> >   return -ENOMEM;
> >   }
> > + entry->title = buf;
> > + utf16_utf8_strncpy(&buf, lo.label, 
> > u16_strlen(lo.label));
> >   entry->command = strdup("bootefi bootmgr");
> >   sprintf(entry->key, "%d", i);
> >   entry->num = i;
> > @@ -315,6 +320,7 @@ static int prepare_uefi_bootorder_entry(struct 
> > bootmenu_data *menu,
> >
> >   return 1;
> >   }
> > +#endif
> >
> >   static struct bootmenu_data *bootmenu_create(int delay)
> >   {
> > @@ -341,13 +347,13 @@ static struct bootmenu_data *bootmenu_create(int 
> > delay)
> >   if (ret < 0)
> >   goto cleanup;
> >
> > - if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
> > - if (i < MAX_COUNT - 1) {
> > +#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
> > + if (i < MAX_COUNT - 1) {
> >   ret = prepare_u

Re: [PATCH v2 1/2] bootmenu: use utf-8 for menu title

2022-05-28 Thread Heinrich Schuchardt

On 5/26/22 12:09, Masahisa Kojima wrote:

The commit a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
changes the bootmenu title type from char to u16(UTF16 string)
to support EFI based system. If EFI_LOADER is not enabled,
printf("%ls") is not supported, so bootmenu does not appear
correctly.

This commit changes the type of menu title from u16(UTF16) to
utf-8 string and EFI strings is conveted into utf-8.

Fixes: a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
Signed-off-by: Masahisa Kojima 
Tested-by: Pali Rohar 
---

(no change since v1)

  cmd/bootmenu.c | 36 +---
  1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
index 8859eebea5..bf88c2127b 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -43,7 +43,7 @@ enum boot_type {
  struct bootmenu_entry {
unsigned short int num; /* unique number 0 .. MAX_COUNT */
char key[3];/* key identifier of number */
-   u16 *title; /* title of entry */
+   char *title;/* title of entry */
char *command;  /* hush command of entry */
enum boot_type type;/* boot type of entry */
u16 bootorder;  /* order for each boot type */
@@ -76,7 +76,7 @@ static void bootmenu_print_entry(void *data)
if (reverse)
puts(ANSI_COLOR_REVERSE);

-   printf("%ls", entry->title);
+   printf("%s", entry->title);

if (reverse)
puts(ANSI_COLOR_RESET);
@@ -170,7 +170,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
struct bootmenu_entry *iter = *current;

while ((option = bootmenu_getoption(i))) {
-   u16 *buf;
+   char *buf;

sep = strchr(option, '=');
if (!sep) {
@@ -183,13 +183,13 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
return -ENOMEM;

len = sep-option;


%s/sep-option/sep - option/


-   buf = calloc(1, (len + 1) * sizeof(u16));
+   buf = calloc(1, (len + 1));
entry->title = buf;
if (!entry->title) {
free(entry);
return -ENOMEM;
}
-   utf8_utf16_strncpy(&buf, option, len);
+   strncpy(buf, option, len);


Instead of two function calls (calloc, strncpy) simply use strdup().



len = strlen(sep + 1);
entry->command = malloc(len + 1);


Use strdup() here too.

Best regards

Heinrich


@@ -227,6 +227,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
return 1;
  }

+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
  /**
   * prepare_uefi_bootorder_entry() - generate the uefi bootmenu entries
   *
@@ -279,13 +280,17 @@ static int prepare_uefi_bootorder_entry(struct 
bootmenu_data *menu,
}

if (lo.attributes & LOAD_OPTION_ACTIVE) {
-   entry->title = u16_strdup(lo.label);
-   if (!entry->title) {
+   char *buf;
+
+   buf = calloc(1, utf16_utf8_strlen(lo.label) + 1);
+   if (!buf) {
free(load_option);
free(entry);
free(bootorder);
return -ENOMEM;
}
+   entry->title = buf;
+   utf16_utf8_strncpy(&buf, lo.label, 
u16_strlen(lo.label));
entry->command = strdup("bootefi bootmgr");
sprintf(entry->key, "%d", i);
entry->num = i;
@@ -315,6 +320,7 @@ static int prepare_uefi_bootorder_entry(struct 
bootmenu_data *menu,

return 1;
  }
+#endif

  static struct bootmenu_data *bootmenu_create(int delay)
  {
@@ -341,13 +347,13 @@ static struct bootmenu_data *bootmenu_create(int delay)
if (ret < 0)
goto cleanup;

-   if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
-   if (i < MAX_COUNT - 1) {
+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
+   if (i < MAX_COUNT - 1) {
ret = prepare_uefi_bootorder_entry(menu, &iter, &i);
if (ret < 0 && ret != -ENOENT)
goto cleanup;
-   }
}
+#endif

/* Add U-Boot console entry at the end */
if (i <= MAX_COUNT - 1) {
@@ -357,9 +363,9 @@ static struct bootmenu_data *bootmenu_create(int delay)

/* Add Quit entry if entering U-Boot console is disabled */
if (IS_ENABLED(CONFIG_CMD_BOOTMENU_ENTER_UBOOT_CONSOLE))
-   entry->title = u16_strdup(u"U-Boot console");
+   entry->title = strdup("U-Boot console");

[PATCH v2 1/2] bootmenu: use utf-8 for menu title

2022-05-26 Thread Masahisa Kojima
The commit a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
changes the bootmenu title type from char to u16(UTF16 string)
to support EFI based system. If EFI_LOADER is not enabled,
printf("%ls") is not supported, so bootmenu does not appear
correctly.

This commit changes the type of menu title from u16(UTF16) to
utf-8 string and EFI strings is conveted into utf-8.

Fixes: a3d0aa87acbe ("bootmenu: update bootmenu_entry structure")
Signed-off-by: Masahisa Kojima 
Tested-by: Pali Rohar 
---

(no change since v1)

 cmd/bootmenu.c | 36 +---
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
index 8859eebea5..bf88c2127b 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -43,7 +43,7 @@ enum boot_type {
 struct bootmenu_entry {
unsigned short int num; /* unique number 0 .. MAX_COUNT */
char key[3];/* key identifier of number */
-   u16 *title; /* title of entry */
+   char *title;/* title of entry */
char *command;  /* hush command of entry */
enum boot_type type;/* boot type of entry */
u16 bootorder;  /* order for each boot type */
@@ -76,7 +76,7 @@ static void bootmenu_print_entry(void *data)
if (reverse)
puts(ANSI_COLOR_REVERSE);
 
-   printf("%ls", entry->title);
+   printf("%s", entry->title);
 
if (reverse)
puts(ANSI_COLOR_RESET);
@@ -170,7 +170,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
struct bootmenu_entry *iter = *current;
 
while ((option = bootmenu_getoption(i))) {
-   u16 *buf;
+   char *buf;
 
sep = strchr(option, '=');
if (!sep) {
@@ -183,13 +183,13 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
return -ENOMEM;
 
len = sep-option;
-   buf = calloc(1, (len + 1) * sizeof(u16));
+   buf = calloc(1, (len + 1));
entry->title = buf;
if (!entry->title) {
free(entry);
return -ENOMEM;
}
-   utf8_utf16_strncpy(&buf, option, len);
+   strncpy(buf, option, len);
 
len = strlen(sep + 1);
entry->command = malloc(len + 1);
@@ -227,6 +227,7 @@ static int prepare_bootmenu_entry(struct bootmenu_data 
*menu,
return 1;
 }
 
+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
 /**
  * prepare_uefi_bootorder_entry() - generate the uefi bootmenu entries
  *
@@ -279,13 +280,17 @@ static int prepare_uefi_bootorder_entry(struct 
bootmenu_data *menu,
}
 
if (lo.attributes & LOAD_OPTION_ACTIVE) {
-   entry->title = u16_strdup(lo.label);
-   if (!entry->title) {
+   char *buf;
+
+   buf = calloc(1, utf16_utf8_strlen(lo.label) + 1);
+   if (!buf) {
free(load_option);
free(entry);
free(bootorder);
return -ENOMEM;
}
+   entry->title = buf;
+   utf16_utf8_strncpy(&buf, lo.label, 
u16_strlen(lo.label));
entry->command = strdup("bootefi bootmgr");
sprintf(entry->key, "%d", i);
entry->num = i;
@@ -315,6 +320,7 @@ static int prepare_uefi_bootorder_entry(struct 
bootmenu_data *menu,
 
return 1;
 }
+#endif
 
 static struct bootmenu_data *bootmenu_create(int delay)
 {
@@ -341,13 +347,13 @@ static struct bootmenu_data *bootmenu_create(int delay)
if (ret < 0)
goto cleanup;
 
-   if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
-   if (i < MAX_COUNT - 1) {
+#if (CONFIG_IS_ENABLED(CMD_BOOTEFI_BOOTMGR))
+   if (i < MAX_COUNT - 1) {
ret = prepare_uefi_bootorder_entry(menu, &iter, &i);
if (ret < 0 && ret != -ENOENT)
goto cleanup;
-   }
}
+#endif
 
/* Add U-Boot console entry at the end */
if (i <= MAX_COUNT - 1) {
@@ -357,9 +363,9 @@ static struct bootmenu_data *bootmenu_create(int delay)
 
/* Add Quit entry if entering U-Boot console is disabled */
if (IS_ENABLED(CONFIG_CMD_BOOTMENU_ENTER_UBOOT_CONSOLE))
-   entry->title = u16_strdup(u"U-Boot console");
+   entry->title = strdup("U-Boot console");
else
-   entry->title = u16_strdup(u"Quit");
+   entry->title = strdup("Quit");
 
if (!entry->title) {
f