Now that the tracking helpers exist, call them from the RAW capsule
path. efi_firmware_raw_set_image() records the attempted version and
the mapped status at each point it can bail out (verification failure,
strdup/env_set errors, and a failed dfu_write_by_alt), and records
success once the write completes.

Either way it then writes the FMP state variable, so a query of ESRT
reflects the outcome of the last attempt instead of stale boot-time
values.

Signed-off-by: Balaji Selvanathan <[email protected]>
---
 lib/efi_loader/efi_firmware.c | 35 ++++++++++++++++++++++++++++++-----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
index cbe8bcd7c64..455d79a19ca 100644
--- a/lib/efi_loader/efi_firmware.c
+++ b/lib/efi_loader/efi_firmware.c
@@ -824,8 +824,17 @@ efi_status_t EFIAPI efi_firmware_raw_set_image(
 
        status = efi_firmware_verify_image(&image, &image_size, image_index,
                                           &state);
-       if (status != EFI_SUCCESS)
+       if (status != EFI_SUCCESS) {
+               /* Set last attempt information for failed verification */
+               efi_firmware_set_last_attempt(&state, state.fw_version,
+                                             
efi_firmware_map_error_to_status(status));
+               efi_firmware_set_fmp_state_var(&state, image_index);
                return EFI_EXIT(status);
+       }
+
+       /* Set last attempt version before starting the update */
+       efi_firmware_set_last_attempt(&state, state.fw_version,
+                                     LAST_ATTEMPT_STATUS_SUCCESS);
 
        /*
         * dfu_alt_num is assigned from 0 while image_index starts from 1.
@@ -850,13 +859,21 @@ efi_status_t EFIAPI efi_firmware_raw_set_image(
                orig_dfu_env = strdup(orig_dfu_env);
                if (!orig_dfu_env) {
                        log_err("strdup() failed!\n");
-                       return EFI_EXIT(EFI_OUT_OF_RESOURCES);
+                       status = EFI_OUT_OF_RESOURCES;
+                       efi_firmware_set_last_attempt(&state, state.fw_version,
+                                                     
efi_firmware_map_error_to_status(status));
+                       efi_firmware_set_fmp_state_var(&state, image_index);
+                       return EFI_EXIT(status);
                }
        }
        if (env_set("dfu_alt_info", update_info.dfu_string)) {
                log_err("Unable to set env variable \"dfu_alt_info\"!\n");
                free(orig_dfu_env);
-               return EFI_EXIT(EFI_DEVICE_ERROR);
+               status = EFI_DEVICE_ERROR;
+               efi_firmware_set_last_attempt(&state, state.fw_version,
+                                             
efi_firmware_map_error_to_status(status));
+               efi_firmware_set_fmp_state_var(&state, image_index);
+               return EFI_EXIT(status);
        }
 
        ret = dfu_write_by_alt(dfu_alt_num, (void *)image, image_size,
@@ -867,9 +884,17 @@ efi_status_t EFIAPI efi_firmware_raw_set_image(
 
        free(orig_dfu_env);
 
-       if (ret)
-               return EFI_EXIT(EFI_DEVICE_ERROR);
+       if (ret) {
+               status = EFI_DEVICE_ERROR;
+               efi_firmware_set_last_attempt(&state, state.fw_version,
+                                             
efi_firmware_map_error_to_status(status));
+               efi_firmware_set_fmp_state_var(&state, image_index);
+               return EFI_EXIT(status);
+       }
 
+       /* Update successful - set success status */
+       efi_firmware_set_last_attempt(&state, state.fw_version,
+                                     LAST_ATTEMPT_STATUS_SUCCESS);
        efi_firmware_set_fmp_state_var(&state, image_index);
 
        return EFI_EXIT(EFI_SUCCESS);

-- 
2.34.1

Reply via email to