Hi Bjoern,

> Package: libefibootguard
> Version: 0.15-1

This is a rather old version of EFI Boot Guard... but upgrading won't help you 
here, see below reasoning.


> When opening and closing a context within libefibootguard, the bootloader 
> config gets corrupted, inhibiting further boots of the system.

Whether or not they get "corrupted" depends on what you do (or rather not do) 
with a once opened environment. The problem is that, in the current 
implementation and semantics of libebgenv, `env_close()` first *writes* to the 
current environment and then closes it. If you happen to write the information 
you read, there's no corruption. However, you're writing to the environment for 
no good reason which one shouldn't do. This is why the SWUpdate binding to EFI 
Boot Guard 
(https://github.com/sbabic/swupdate/blob/master/bootloader/ebg.c#L89-L91) goes 
to great lengths to avoid this behavior...


> Context:
> We are using efibootguard in context of isar-cip-core with A/B partitioning 
> scheme:
> Partition 1 - efibootguard
> Partition 2 - efibootguard config A
> Partition 3 - efibootguard config B
> 
> After software update, we need to know if the bootloader is in testing mode 
> so that we can trigger a rollback. For this, we need to call 
> ebg_env_getglobalstate which is taking a pointer provided by 
> ebg_env_open_current.
> 
> Code:
>  ebgenv_t e;
>  ebg_env_open_current(&e); // seems that closing is not really needed, no 
> leaks found.
>  uint16_t ustate = ebg_env_getglobalstate(NULL);
>  //ebg_env_close(&e); not closing it beacuse it writes & breaks
> 
>  printf("obtained ustate is %u\n", ustate);
> 
>  if (ustate == 2 /*testing mode */) {
>    return 0;
>  }
>  else {
>    return -1;
>  }
> 
> Expected Behaviour:
> efibootguad configs (on partition 2 and 3) should not get corrupted.
> 
> Possible Solution/Workaround:
> We are now calling ebg_env_getglobalstate with NULL as a parameter as, 
> looking at the code, it is not used anyway. So we don't need to do open/close.
> 
> Steps to reproduce:
> 
> 1. Do ebg_env_open_current and ebg_env_close in a loop and interrupt it with 
> CTRL-C
> 2. check config with bg_printenv
> 3. one config is set to all (most) zeros. Works mostly on first attempt, 
> retry loop if needed.
> 
> 
> We can work for now, but this should be fixed in the future.

Yes, this will definitely need to be addressed in a libebgenv version 2.0.



Kind regards,
  Christian

-- 
Dr. Christian Storm
Siemens AG, FT RPD CED
Friedrich-Ludwig-Bauer-Str. 3, 85748 Garching, Germany

-- 
You received this message because you are subscribed to the Google Groups "EFI 
Boot Guard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to efibootguard-dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/efibootguard-dev/8DFBD265-2FD8-4EA7-9776-E317F6559E72%40siemens.com.

Reply via email to