diff mbox series

[RESEND,v2] efi_loader: Fix UEFI variable error handling

Message ID 20231113161031.138304-1-o451686892@gmail.com
State Rejected, archived
Delegated to: Heinrich Schuchardt
Headers show
Series [RESEND,v2] efi_loader: Fix UEFI variable error handling | expand

Commit Message

Weizhao Ouyang Nov. 13, 2023, 4:10 p.m. UTC
Try to catch error the earlier way.

Signed-off-by: Weizhao Ouyang <o451686892@gmail.com>
---
 lib/efi_loader/efi_var_file.c | 4 +++-
 lib/efi_loader/efi_variable.c | 2 --
 2 files changed, 3 insertions(+), 3 deletions(-)

Comments

Heinrich Schuchardt Nov. 15, 2023, 10:15 a.m. UTC | #1
On 11/13/23 17:10, Weizhao Ouyang wrote:
> Try to catch error the earlier way.
>
> Signed-off-by: Weizhao Ouyang <o451686892@gmail.com>
> ---
>   lib/efi_loader/efi_var_file.c | 4 +++-
>   lib/efi_loader/efi_variable.c | 2 --
>   2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c
> index 62e071bd83..fe1c462f17 100644
> --- a/lib/efi_loader/efi_var_file.c
> +++ b/lib/efi_loader/efi_var_file.c
> @@ -192,8 +192,10 @@ efi_status_t efi_var_restore(struct efi_var_file *buf, bool safe)
>   		ret = efi_var_mem_ins(var->name, &var->guid, var->attr,
>   				      var->length, data, 0, NULL,
>   				      var->time);
> -		if (ret != EFI_SUCCESS)
> +		if (ret != EFI_SUCCESS) {
>   			log_err("Failed to set EFI variable %ls\n", var->name);
> +			return ret;

This change implies that if a failure occurs, initialization of the EFI
sub-system fails and you will not be able to boot via EFI.

Such a failure will occur if ubootefi.var contains more variables than
fit into the memory buffer.

Please, describe why you want to disable U-Boot's EFI sub-system in this
case.

> +		}
>   	}
>   	return EFI_SUCCESS;
>   }
> diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> index be95ed44e6..2b2ca8c090 100644
> --- a/lib/efi_loader/efi_variable.c
> +++ b/lib/efi_loader/efi_variable.c
> @@ -350,8 +350,6 @@ efi_status_t efi_set_variable_int(const u16 *variable_name,
>
>   	if (var_type == EFI_AUTH_VAR_PK)
>   		ret = efi_init_secure_state();
> -	else
> -		ret = EFI_SUCCESS;

This change is ok.

Best regards

Heinrich

>
>   	/*
>   	 * Write non-volatile EFI variables to file
Weizhao Ouyang Nov. 15, 2023, 10:45 a.m. UTC | #2
On Wed, Nov 15, 2023 at 6:15 PM Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 11/13/23 17:10, Weizhao Ouyang wrote:
> > Try to catch error the earlier way.
> >
> > Signed-off-by: Weizhao Ouyang <o451686892@gmail.com>
> > ---
> >   lib/efi_loader/efi_var_file.c | 4 +++-
> >   lib/efi_loader/efi_variable.c | 2 --
> >   2 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c
> > index 62e071bd83..fe1c462f17 100644
> > --- a/lib/efi_loader/efi_var_file.c
> > +++ b/lib/efi_loader/efi_var_file.c
> > @@ -192,8 +192,10 @@ efi_status_t efi_var_restore(struct efi_var_file *buf, bool safe)
> >               ret = efi_var_mem_ins(var->name, &var->guid, var->attr,
> >                                     var->length, data, 0, NULL,
> >                                     var->time);
> > -             if (ret != EFI_SUCCESS)
> > +             if (ret != EFI_SUCCESS) {
> >                       log_err("Failed to set EFI variable %ls\n", var->name);
> > +                     return ret;
>
> This change implies that if a failure occurs, initialization of the EFI
> sub-system fails and you will not be able to boot via EFI.
>
> Such a failure will occur if ubootefi.var contains more variables than
> fit into the memory buffer.
>
> Please, describe why you want to disable U-Boot's EFI sub-system in this
> case.

Hi Heinrich,

In my case, if a variable wants to persist as a non-volatile variable to
ubootefi.var, we should keep the same behavior as runtime variable does.
Otherwise the ubootefi.var cannot be trusted.

BR,
Weizhao

>
> > +             }
> >       }
> >       return EFI_SUCCESS;
> >   }
> > diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
> > index be95ed44e6..2b2ca8c090 100644
> > --- a/lib/efi_loader/efi_variable.c
> > +++ b/lib/efi_loader/efi_variable.c
> > @@ -350,8 +350,6 @@ efi_status_t efi_set_variable_int(const u16 *variable_name,
> >
> >       if (var_type == EFI_AUTH_VAR_PK)
> >               ret = efi_init_secure_state();
> > -     else
> > -             ret = EFI_SUCCESS;
>
> This change is ok.
>
> Best regards
>
> Heinrich
>
> >
> >       /*
> >        * Write non-volatile EFI variables to file
>
diff mbox series

Patch

diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c
index 62e071bd83..fe1c462f17 100644
--- a/lib/efi_loader/efi_var_file.c
+++ b/lib/efi_loader/efi_var_file.c
@@ -192,8 +192,10 @@  efi_status_t efi_var_restore(struct efi_var_file *buf, bool safe)
 		ret = efi_var_mem_ins(var->name, &var->guid, var->attr,
 				      var->length, data, 0, NULL,
 				      var->time);
-		if (ret != EFI_SUCCESS)
+		if (ret != EFI_SUCCESS) {
 			log_err("Failed to set EFI variable %ls\n", var->name);
+			return ret;
+		}
 	}
 	return EFI_SUCCESS;
 }
diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c
index be95ed44e6..2b2ca8c090 100644
--- a/lib/efi_loader/efi_variable.c
+++ b/lib/efi_loader/efi_variable.c
@@ -350,8 +350,6 @@  efi_status_t efi_set_variable_int(const u16 *variable_name,
 
 	if (var_type == EFI_AUTH_VAR_PK)
 		ret = efi_init_secure_state();
-	else
-		ret = EFI_SUCCESS;
 
 	/*
 	 * Write non-volatile EFI variables to file