ACK: [PATCH] lib: fwts_cpu: fix memory leak and incorrect return (LP: #1549723)
Alex Hung
alex.hung at canonical.com
Fri Feb 26 07:30:59 UTC 2016
On 02/25/2016 07:11 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Latest CoverityScan run picked up a minor memory leak:
>
> if (fwts_cpu_readmsr(0, MSR_AMD64_OSVW_STATUS, &val) != FWTS_OK)
> CID 1351543 (#2 of 2): Resource leak (RESOURCE_LEAK)
> leaked_storage: Variable cpu going out of scope leaks the storage
> it points to.
>
> While fixing this bug I noticed that the case when family 0x0f
> models < rev F do not have C1E the code was returning FWTS_TRUE and
> should be returning FWTS_FALSE.
>
> Also, for non-x86 builds, skip all the x86 specific checks and always
> return FWTS_FALSE.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/lib/src/fwts_cpu.c | 32 +++++++++++++++++++++-----------
> 1 file changed, 21 insertions(+), 11 deletions(-)
>
> diff --git a/src/lib/src/fwts_cpu.c b/src/lib/src/fwts_cpu.c
> index 7a4b5b2..bcdb89d 100644
> --- a/src/lib/src/fwts_cpu.c
> +++ b/src/lib/src/fwts_cpu.c
> @@ -195,22 +195,25 @@ int fwts_cpu_is_AMD(bool *is_amd)
> */
> fwts_bool fwts_cpu_has_c1e(void)
> {
> +#if FWTS_ARCH_X86
> uint64_t val;
> + fwts_bool rc = FWTS_FALSE;
>
> fwts_cpuinfo_x86 *cpu;
>
> if ((cpu = fwts_cpu_get_info(0)) == NULL)
> return FWTS_BOOL_ERROR;
>
> + /* no C1E on AMD */
> if (strstr(cpu->vendor_id, "AuthenticAMD") == NULL) {
> - fwts_cpu_free_info(cpu);
> - return FWTS_FALSE;
> + rc = FWTS_FALSE;
> + goto free_info;
> }
>
> /* Family 0x0f models < rev F do not have C1E */
> if (cpu->x86 == 0x0F && cpu->x86_model >= 0x40) {
> - fwts_cpu_free_info(cpu);
> - return FWTS_TRUE;
> + rc = FWTS_FALSE;
> + goto free_info;
> }
>
> if (cpu->x86 == 0x10) {
> @@ -219,23 +222,30 @@ fwts_bool fwts_cpu_has_c1e(void)
> * by erratum #400
> */
> if (strstr(cpu->flags, "osvw") != NULL) {
> - if (fwts_cpu_readmsr(0, MSR_AMD64_OSVW_ID_LENGTH, &val) != FWTS_OK)
> - return FWTS_BOOL_ERROR;
> + if (fwts_cpu_readmsr(0, MSR_AMD64_OSVW_ID_LENGTH, &val) != FWTS_OK) {
> + rc = FWTS_BOOL_ERROR;
> + goto free_info;
> + }
>
> if (val >= 2) {
> if (fwts_cpu_readmsr(0, MSR_AMD64_OSVW_STATUS, &val) != FWTS_OK)
> - return FWTS_BOOL_ERROR;
> + rc = FWTS_BOOL_ERROR;
> + goto free_info;
> if (!(val & 2)) {
> - fwts_cpu_free_info(cpu);
> - return FWTS_FALSE;
> + rc = FWTS_FALSE;
> + goto free_info;
> }
> }
> }
> - fwts_cpu_free_info(cpu);
> - return FWTS_TRUE;
> + rc = FWTS_TRUE;
> }
> +
> +free_info:
> fwts_cpu_free_info(cpu);
> + return rc;
> +#else
> return FWTS_FALSE;
> +#endif
> }
>
> /*
>
Acked-by: Alex Hung <alex.hung at canonical.com>
More information about the fwts-devel
mailing list