Index: src/platform/vboot_reference/utils/firmware_image.c |
diff --git a/src/platform/vboot_reference/utils/firmware_image.c b/src/platform/vboot_reference/utils/firmware_image.c |
index c0a660bc8d08e28e3070a296be0094e3b3cc1db4..cd8e942dda7b5a0383af45ba337e3ad15e82ec24 100644 |
--- a/src/platform/vboot_reference/utils/firmware_image.c |
+++ b/src/platform/vboot_reference/utils/firmware_image.c |
@@ -394,12 +394,12 @@ int VerifyFirmware(const uint8_t* root_key_blob, |
const int dev_mode) { |
int error_code; |
int algorithm; /* Signing key algorithm. */ |
- RSAPublicKey* firmware_sign_key; |
+ RSAPublicKey* firmware_sign_key = NULL; |
int firmware_sign_key_len, signature_len, header_len, firmware_len; |
- const uint8_t* header_ptr; /* Pointer to header. */ |
- const uint8_t* firmware_sign_key_ptr; /* Pointer to signing key. */ |
- const uint8_t* preamble_ptr; /* Pointer to preamble block. */ |
- const uint8_t* firmware_ptr; /* Pointer to firmware signature/data. */ |
+ const uint8_t* header_ptr = NULL; /* Pointer to header. */ |
+ const uint8_t* firmware_sign_key_ptr = NULL; /* Pointer to signing key. */ |
+ const uint8_t* preamble_ptr = NULL; /* Pointer to preamble block. */ |
+ const uint8_t* firmware_ptr = NULL; /* Pointer to firmware signature/data. */ |
/* Note: All the offset calculations are based on struct FirmwareImage which |
* is defined in include/firmware_image.h. */ |
@@ -428,9 +428,10 @@ int VerifyFirmware(const uint8_t* root_key_blob, |
FIELD_LEN(firmware_key_signature)); |
if ((error_code = VerifyFirmwarePreamble(firmware_sign_key, preamble_ptr, |
algorithm, |
- &firmware_len))) |
+ &firmware_len))) { |
+ RSAPublicKeyFree(firmware_sign_key); |
return error_code; /* AKA jump to recovery. */ |
- |
+ } |
/* Only continue if firmware data verification succeeds. */ |
firmware_ptr = (preamble_ptr + |
FIELD_LEN(firmware_version) + |
@@ -440,16 +441,19 @@ int VerifyFirmware(const uint8_t* root_key_blob, |
if ((error_code = VerifyFirmwareData(firmware_sign_key, firmware_ptr, |
firmware_len, |
- algorithm))) |
+ algorithm))) { |
+ RSAPublicKeyFree(firmware_sign_key); |
return error_code; /* AKA jump to recovery. */ |
+ } |
+ RSAPublicKeyFree(firmware_sign_key); |
return 0; /* Success! */ |
} |
int VerifyFirmwareImage(const RSAPublicKey* root_key, |
const FirmwareImage* image, |
const int dev_mode) { |
- RSAPublicKey* firmware_sign_key; |
+ RSAPublicKey* firmware_sign_key = NULL; |
uint8_t* header_digest = NULL; |
uint8_t* preamble_digest = NULL; |
uint8_t* firmware_digest = NULL; |
@@ -527,6 +531,7 @@ int VerifyFirmwareImage(const RSAPublicKey* root_key, |
} |
verify_failure: |
+ RSAPublicKeyFree(firmware_sign_key); |
Free(firmware_digest); |
Free(preamble_digest); |
Free(header_digest); |