@@ -1711,8 +1711,10 @@ static struct tpm_bank_info *init_tpm_banks(int *num_banks)
int i, j;
banks = calloc(num_algos, sizeof(struct tpm_bank_info));
- if (!banks)
- return banks;
+ if (!banks) {
+ log_err("Out of memory\n");
+ return NULL;
+ }
/* re-calculate the PCRs digests for only known algorithms */
*num_banks = num_algos;
@@ -2083,8 +2085,8 @@ static int read_tpm_banks(int num_banks, struct tpm_bank_info *bank)
static int ima_measurement(const char *file)
{
struct tpm_bank_info *pseudo_padded_banks;
- struct tpm_bank_info *pseudo_banks;
- struct tpm_bank_info *tpm_banks;
+ struct tpm_bank_info *pseudo_banks = NULL;
+ struct tpm_bank_info *tpm_banks = NULL;
int is_ima_template, cur_template_fmt;
int num_banks = 0;
int tpmbanks = 1;
@@ -2102,13 +2104,21 @@ static int ima_measurement(const char *file)
memset(zero, 0, MAX_DIGEST_SIZE);
pseudo_padded_banks = init_tpm_banks(&num_banks);
+ if (!pseudo_padded_banks)
+ return -1;
+
pseudo_banks = init_tpm_banks(&num_banks);
+ if (!pseudo_banks)
+ goto out_free;
+
tpm_banks = init_tpm_banks(&num_banks);
+ if (!tpm_banks)
+ goto out_free;
fp = fopen(file, "rb");
if (!fp) {
log_err("Failed to open measurement file: %s\n", file);
- return -1;
+ goto out;
}
if (imaevm_params.keyfile) /* Support multiple public keys */
@@ -2311,6 +2321,11 @@ static int ima_measurement(const char *file)
out:
fclose(fp);
+out_free:
+ free(tpm_banks);
+ free(pseudo_banks);
+ free(pseudo_padded_banks);
+
return err;
}
@@ -2556,6 +2571,8 @@ static int cmd_ima_bootaggr(struct command *cmd)
*/
if (file) {
tpm_banks = init_tpm_banks(&num_banks);
+ if (!tpm_banks)
+ return -1;
/* TPM 1.2 only supports SHA1.*/
for (i = 1; i < num_banks; i++)
@@ -2565,12 +2582,19 @@ static int cmd_ima_bootaggr(struct command *cmd)
if (err) {
log_err("Failed reading the TPM 1.2 event log (%s)\n",
file);
+ free(tpm_banks);
+
return -1;
}
} else {
tpm_banks = init_tpm_banks(&num_banks);
+ if (!tpm_banks)
+ return -1;
+
if (read_tpm_banks(num_banks, tpm_banks) != 0) {
log_info("Failed to read any TPM PCRs\n");
+ free(tpm_banks);
+
return -1;
}
}
@@ -2604,7 +2628,10 @@ static int cmd_ima_bootaggr(struct command *cmd)
}
bootaggr[bootaggr_len] = '\0';
printf("%s", bootaggr);
+
free(bootaggr);
+ free(tpm_banks);
+
return 0;
}
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> --- src/evmctl.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-)