From ca84e57463cacaa0d6b8f81b11ca6714c77e88c5 Mon Sep 17 00:00:00 2001 From: Thomas Knudsen Date: Tue, 3 Oct 2017 13:47:11 +0200 Subject: Enable address sanitizer in linux/clang build Elim some leaks by initializing PJ.destructor in PJ_ob_tran.c properly Avoid tests bombing when built with address sanitizer: Repair memory leak in test228.c Avoid tests bombing when built with address sanitizer: Repair memory leak in multistresstest.c --- src/PJ_ob_tran.c | 15 ++++++++------- src/multistresstest.c | 2 ++ src/pj_malloc.c | 1 - src/test228.c | 2 ++ 4 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/PJ_ob_tran.c b/src/PJ_ob_tran.c index 793ace38..cd6f72db 100644 --- a/src/PJ_ob_tran.c +++ b/src/PJ_ob_tran.c @@ -84,13 +84,12 @@ static LP t_inverse(XY xy, PJ *P) { /* spheroid */ static void *destructor(PJ *P, int errlev) { if (0==P) return 0; - if (0==P->opaque) return pj_default_destructor (P, errlev); - + if (P->opaque->link) P->opaque->link->destructor (P->opaque->link, errlev); - + return pj_default_destructor(P, errlev); } @@ -166,12 +165,14 @@ PJ *PROJECTION(ob_tran) { struct pj_opaque *Q = pj_calloc (1, sizeof (struct pj_opaque)); if (0==Q) - return pj_default_destructor(P, ENOMEM); - P->opaque = Q; + return destructor(P, ENOMEM); - if (0 != P->es) - return pj_default_destructor(P, PJD_ERR_ELLIPSOIDAL_UNSUPPORTED); + P->opaque = Q; + P->destructor = destructor; + if (0 != P->es) + return destructor(P, PJD_ERR_ELLIPSOIDAL_UNSUPPORTED); + /* get name of projection to be translated */ if (!(name = pj_param(P->ctx, P->params, "so_proj").s)) return destructor(P, PJD_ERR_NO_ROTATION_PROJ); diff --git a/src/multistresstest.c b/src/multistresstest.c index 8fb764e2..ddbbb033 100644 --- a/src/multistresstest.c +++ b/src/multistresstest.c @@ -363,6 +363,7 @@ static int do_main(void) { printf( "Unable to translate:\n%s\n", test->src_def ); test->skip = 1; + pj_free (dst_pj); continue; } @@ -370,6 +371,7 @@ static int do_main(void) { printf( "Unable to translate:\n%s\n", test->dst_def ); test->skip = 1; + pj_free (src_pj); continue; } diff --git a/src/pj_malloc.c b/src/pj_malloc.c index 9c69257f..75d05378 100644 --- a/src/pj_malloc.c +++ b/src/pj_malloc.c @@ -161,7 +161,6 @@ void *pj_default_destructor (PJ *P, int errlev) { /* Destructor */ if (0==P) return 0; - /* free grid lists */ pj_dealloc( P->gridlist ); pj_dealloc( P->vgridlist_geoid ); diff --git a/src/test228.c b/src/test228.c index 1f3d04e8..94f0ec08 100644 --- a/src/test228.c +++ b/src/test228.c @@ -54,6 +54,8 @@ static void* thread_main(void* unused) assert(fabs(y - 49.999396034285531698) < 1e-15); } + pj_free (p_OSGB36_proj); + pj_free (p_WGS84_proj); return NULL; } -- cgit v1.2.3