Coverity found a memory leak in tpm_ascii_bios_measurements_open(). If "read_log(log)" fails, then we may leak 'log' and 'log->bios_event_log'.
Unified · Split
| @@ -427,7 +427,7 @@ static int tpm_ascii_bios_measurements_open(struct inode *inode, · 426 unmodified lines | |||
| 427 | return -ENOMEM; | 427 | return -ENOMEM; |
| 428 | 428 | ||
| 429 | if ((err = read_log(log))) | 429 | if ((err = read_log(log))) |
| 430 | return err; | 430 | goto out_free; |
| 431 | 431 | ||
| 432 | /* now register seq file */ | 432 | /* now register seq file */ |
| 433 | err = seq_open(file, &tpm_ascii_b_measurments_seqops); | 433 | err = seq_open(file, &tpm_ascii_b_measurments_seqops); |
| @@ -435,10 +435,15 @@ static int tpm_ascii_bios_measurements_open(struct inode *inode, · 1 unmodified line | |||
| 435 | seq = file->private_data; | 435 | seq = file->private_data; |
| 436 | seq->private = log; | 436 | seq->private = log; |
| 437 | } else { | 437 | } else { |
| 438 | kfree(log->bios_event_log); | 438 | goto out_free; |
| 439 | kfree(log); | ||
| 440 | } | 439 | } |
| 440 | |||
| 441 | out: | ||
| 441 | return err; | 442 | return err; |
| 443 | out_free: | ||
| 444 | kfree(log->bios_event_log); | ||
| 445 | kfree(log); | ||
| 446 | goto out; | ||
| 442 | } | 447 | } |
| 443 | 448 | ||
| 444 | const struct file_operations tpm_ascii_bios_measurements_ops = { | 449 | const struct file_operations tpm_ascii_bios_measurements_ops = { |