Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxx> --- src/evmctl.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/evmctl.c b/src/evmctl.c index 349215e..c2fe152 100644 --- a/src/evmctl.c +++ b/src/evmctl.c @@ -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; } -- 2.38.1