VBoot Reference: Fix many memory leaks.

Fix memory leaks found using Valgrind, adds sanity checking to RSAPublicKey parsing code to prevent crazy behavior.

Review URL: http://codereview.chromium.org/858008
diff --git a/utils/kernel_image.c b/utils/kernel_image.c
index 893f49a..8201137 100644
--- a/utils/kernel_image.c
+++ b/utils/kernel_image.c
@@ -500,8 +500,10 @@
   config_ptr = (header_ptr + header_len + kernel_key_signature_len);
   if ((error_code = VerifyKernelConfig(kernel_sign_key, config_ptr,
                                        kernel_sign_algorithm,
-                                       &kernel_len)))
+                                       &kernel_len))) {
+    RSAPublicKeyFree(kernel_sign_key);
     return error_code;  /* AKA jump to recovery. */
+  }
   /* Only continue if kernel data verification succeeds. */
   kernel_ptr = (config_ptr +
                 FIELD_LEN(kernel_version) +
@@ -512,15 +514,18 @@
                 kernel_signature_len);
 
   if ((error_code = VerifyKernelData(kernel_sign_key, kernel_ptr, kernel_len,
-                                     kernel_sign_algorithm)))
+                                     kernel_sign_algorithm))) {
+    RSAPublicKeyFree(kernel_sign_key);
     return error_code;  /* AKA jump to recovery. */
+  }
+  RSAPublicKeyFree(kernel_sign_key);
   return 0;  /* Success! */
 }
 
 int VerifyKernelImage(const RSAPublicKey* firmware_key,
                       const KernelImage* image,
                       const int dev_mode) {
-  RSAPublicKey* kernel_sign_key;
+  RSAPublicKey* kernel_sign_key = NULL;
   uint8_t* header_digest = NULL;
   uint8_t* config_digest = NULL;
   uint8_t* kernel_digest = NULL;
@@ -610,6 +615,7 @@
   }
 
 verify_failure:
+  RSAPublicKeyFree(kernel_sign_key);
   Free(kernel_digest);
   Free(config_digest);
   Free(header_digest);
@@ -622,7 +628,7 @@
 
 int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) {
   uint8_t* header_blob = NULL;
-  uint8_t* signature;
+  uint8_t* signature = NULL;
   int signature_len = siglen_map[image->firmware_sign_algorithm];
   if (!image || !firmware_key_file)
     return 0;
@@ -645,9 +651,9 @@
 
 int AddKernelSignature(KernelImage* image,
                        const char* kernel_signing_key_file) {
-  uint8_t* config_blob;
-  uint8_t* config_signature;
-  uint8_t* kernel_signature;
+  uint8_t* config_blob = NULL;
+  uint8_t* config_signature = NULL;
+  uint8_t* kernel_signature = NULL;
   int signature_len = siglen_map[image->kernel_sign_algorithm];
 
   config_blob = GetKernelConfigBlob(image);
@@ -659,6 +665,7 @@
     Free(config_blob);
     return 0;
   }
+  Free(config_blob);
 
   image->config_signature = (uint8_t*) Malloc(signature_len);
   Memcpy(image->config_signature, config_signature, signature_len);