test: tee: fix resource leak in dm_test_tee()
authorJens Wiklander <jens.wiklander@linaro.org>
Mon, 29 Oct 2018 10:41:35 +0000 (11:41 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 1 Nov 2018 14:02:43 +0000 (10:02 -0400)
Fixes possible resource leak in dm_test_tee() reported by Coverity.

Reported-by: Coverity (CID: 184175)
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
test/dm/tee.c

index 13e3f4003a7d918f32b36e137c7b4ae06bad923d..22f05a4219783c8a7826b1b0750e49509c177e26 100644 (file)
@@ -49,7 +49,12 @@ static int match(struct tee_version_data *vers, const void *data)
        return vers->gen_caps & TEE_GEN_CAP_GP;
 }
 
-static int dm_test_tee(struct unit_test_state *uts)
+struct test_tee_vars {
+       struct tee_shm *reg_shm;
+       struct tee_shm *alloc_shm;
+};
+
+static int test_tee(struct unit_test_state *uts, struct test_tee_vars *vars)
 {
        struct tee_version_data vers;
        struct udevice *dev;
@@ -57,8 +62,6 @@ static int dm_test_tee(struct unit_test_state *uts)
        u32 session = 0;
        int rc;
        u8 data[128];
-       struct tee_shm *reg_shm;
-       struct tee_shm *alloc_shm;
 
        dev = tee_find_device(NULL, match, NULL, &vers);
        ut_assert(dev);
@@ -77,22 +80,36 @@ static int dm_test_tee(struct unit_test_state *uts)
        ut_assert(!state->session);
 
        ut_assert(!state->num_shms);
-       rc = tee_shm_register(dev, data, sizeof(data), 0, &reg_shm);
+       rc = tee_shm_register(dev, data, sizeof(data), 0, &vars->reg_shm);
        ut_assert(!rc);
        ut_assert(state->num_shms == 1);
 
-       rc = tee_shm_alloc(dev, 256, 0, &alloc_shm);
+       rc = tee_shm_alloc(dev, 256, 0, &vars->alloc_shm);
        ut_assert(!rc);
        ut_assert(state->num_shms == 2);
 
-       ut_assert(tee_shm_is_registered(reg_shm, dev));
-       ut_assert(tee_shm_is_registered(alloc_shm, dev));
+       ut_assert(tee_shm_is_registered(vars->reg_shm, dev));
+       ut_assert(tee_shm_is_registered(vars->alloc_shm, dev));
 
-       tee_shm_free(reg_shm);
-       tee_shm_free(alloc_shm);
+       tee_shm_free(vars->reg_shm);
+       vars->reg_shm = NULL;
+       tee_shm_free(vars->alloc_shm);
+       vars->alloc_shm = NULL;
        ut_assert(!state->num_shms);
 
        return 0;
 }
 
+static int dm_test_tee(struct unit_test_state *uts)
+{
+       struct test_tee_vars vars = { NULL, NULL };
+       int rc = test_tee(uts, &vars);
+
+       /* In case test_tee() asserts these may still remain allocated */
+       tee_shm_free(vars.reg_shm);
+       tee_shm_free(vars.alloc_shm);
+
+       return rc;
+}
+
 DM_TEST(dm_test_tee, DM_TESTF_SCAN_FDT);