From 9ecc3c73cac545337043a411e1bdc9740045187d Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Tue, 12 Mar 2019 19:49:48 +1100
Subject: [PATCH] be clean with heap memory

---
 src/lib66/ssexec_disable.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/lib66/ssexec_disable.c b/src/lib66/ssexec_disable.c
index d411733f..50dc51f1 100644
--- a/src/lib66/ssexec_disable.c
+++ b/src/lib66/ssexec_disable.c
@@ -56,23 +56,30 @@ int svc_remove(genalloc *tostop,ss_resolve_t *res, char const *src,ssexec_t *inf
 	unsigned int i = 0 ;
 	genalloc rdeps = GENALLOC_ZERO ;
 	stralloc dst = STRALLOC_ZERO ;
+	ss_resolve_t cp = RESOLVE_ZERO ;
 	size_t newlen ;
-	
 	char *name = res->sa.s + res->name ;
+	if (!ss_resolve_copy(&cp,res))
+	{
+		VERBO1 strerr_warnwu1sys("copy resolve file") ;
+		goto err ;
+	}
 	if (!stralloc_cats(&dst,src)) goto err ;
-	if (res->type == CLASSIC)
+	if (cp.type == CLASSIC)
 	{
 		if (!stralloc_cats(&dst,SS_SVC)) goto err ;
 	}
 	else if (!stralloc_cats(&dst,SS_DB SS_SRC)) retstralloc(0,"remove_sv") ;
 	if (!stralloc_cats(&dst,"/")) goto err ;
 	newlen = dst.len ;
-	
-	if (!ss_resolve_add_rdeps(&rdeps,res,info))
+
+	if (!ss_resolve_add_rdeps(&rdeps,&cp,info))
 	{
 		VERBO1 strerr_warnwu2sys("resolve recursive dependencies of: ",name) ;
 		goto err ;
 	}
+	ss_resolve_free(&cp) ;
+	
 	if (!ss_resolve_add_logger(&rdeps,info))
 	{
 		VERBO1 strerr_warnwu1sys("resolve logger") ;
@@ -106,13 +113,16 @@ int svc_remove(genalloc *tostop,ss_resolve_t *res, char const *src,ssexec_t *inf
 			goto err ;
 		}
 		if (!ss_resolve_cmp(tostop,name))
-			if (!genalloc_append(ss_resolve_t,tostop,pres)) goto err ;
+			if (!ss_resolve_append(tostop,pres)) goto err ;
 	}
-
+	
+	genalloc_deepfree(ss_resolve_t,&rdeps,ss_resolve_free) ;
 	stralloc_free(&dst) ;
 	return 1 ;
 	
 	err:
+		ss_resolve_free(&cp) ;
+		genalloc_deepfree(ss_resolve_t,&rdeps,ss_resolve_free) ;
 		stralloc_free(&dst) ;
 		return 0 ;
 }
@@ -164,7 +174,6 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 				cleanup(workdir.s) ;
 				strerr_dief1x(110,"nice try peon") ;
 		}
-		ss_resolve_init(&res) ;
 		logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
 		if (logname > 0)
 		{
@@ -185,6 +194,7 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 		if (!res.disen)
 		{
 			VERBO1 strerr_warni2x(name,": is already disabled") ;
+			ss_resolve_free(&res) ;
 			continue ;
 		}
 		if (!svc_remove(&tostop,&res,workdir.s,info))
@@ -194,6 +204,7 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 		}
 		if (res.type == CLASSIC) nclassic++ ;
 		else nlongrun++ ;
+		ss_resolve_free(&res) ;
 	}
 	
 	if (nclassic)
-- 
GitLab