From d77b88e8bde8247fa1db4e0c12eb2f3fcc7f9fa4 Mon Sep 17 00:00:00 2001 From: Lukas Nykryn Date: Tue, 7 May 2024 12:38:44 +0200 Subject: [PATCH] ntsysv: fix leaks --- chkconfig.c | 4 ++-- leveldb.c | 11 +++-------- leveldb.h | 3 +-- ntsysv.c | 15 ++++++++++++--- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/chkconfig.c b/chkconfig.c index 45f0015a..fcc0a8bc 100644 --- a/chkconfig.c +++ b/chkconfig.c @@ -168,7 +168,7 @@ static int delService(char *name, int type, int level) { finish: freeService(s); - freeServices(&services, numservs); + freeServices(services, numservs); return rc; } @@ -331,7 +331,7 @@ static int frobDependencies(struct service *s) { if (frobOneDependencies(s, servs, numservs, 1, LSB) == -1) r=1; - freeServices(&servs, numservs); + freeServices(servs, numservs); return r; } diff --git a/leveldb.c b/leveldb.c index d4bce117..2de1ac08 100644 --- a/leveldb.c +++ b/leveldb.c @@ -330,15 +330,10 @@ void freeService(struct service s) { free(s.provides); } -void freepService(struct service **s) { - freeService(**s); - free(*s); -} - -void freeServices(struct service **s, int n) { +void freeServices(struct service *s, int n) { for (int i = 0; i < n; i++) - freepService(&s[i]); - free(*s); + freeService(s[i]); + free(s); } int readServices(struct service **services) { diff --git a/leveldb.h b/leveldb.h index 11d6b589..bfaa9aee 100644 --- a/leveldb.h +++ b/leveldb.h @@ -57,8 +57,7 @@ struct service { int parseLevels(char *str, int emptyOk); void freeService(struct service s); -void freepService(struct service **s); -void freeServices(struct service **s, int n); +void freeServices(struct service *s, int n); /* returns 0 on success, 1 if the service is not chkconfig-able, -1 if an I/O error occurs (in which case errno can be checked) */ int readServiceInfo(char *name, int type, struct service *service, diff --git a/ntsysv.c b/ntsysv.c index 3ab9c57a..1a39401b 100644 --- a/ntsysv.c +++ b/ntsysv.c @@ -313,11 +313,12 @@ static int getServices(struct service **servicesPtr, int *numServicesPtr, int systemd = systemdActive(); numServicesAlloced = 10; - services = malloc(sizeof(*services) * numServicesAlloced); + services = malloc(sizeof(struct service) * numServicesAlloced); if (!(dir = opendir(RUNLEVELS "/init.d"))) { fprintf(stderr, "failed to open " RUNLEVELS "/init.d: %s\n", strerror(errno)); + free(services); return 2; } @@ -340,7 +341,9 @@ static int getServices(struct service **servicesPtr, int *numServicesPtr, if (numServices == numServicesAlloced) { numServicesAlloced += 10; services = - realloc(services, numServicesAlloced * sizeof(*services)); + realloc(services, numServicesAlloced * sizeof(struct service)); + memset(services + numServices, 0, + (numServicesAlloced - numServices) * sizeof(struct service)); } rc = readServiceInfo(ent->d_name, TYPE_INIT_D, services + numServices, @@ -372,6 +375,7 @@ static int getServices(struct service **servicesPtr, int *numServicesPtr, if (!(dir = opendir(XINETDDIR))) { fprintf(stderr, "failed to open " XINETDDIR ": %s\n", strerror(errno)); + freeServices(services, numServicesAlloced); return 2; } @@ -391,7 +395,9 @@ static int getServices(struct service **servicesPtr, int *numServicesPtr, if (numServices == numServicesAlloced) { numServicesAlloced += 10; services = - realloc(services, numServicesAlloced * sizeof(*services)); + realloc(services, numServicesAlloced * sizeof(struct service)); + memset(services + numServices, 0, + (numServicesAlloced - numServices) * sizeof(struct service)); } rc = readXinetdServiceInfo(ent->d_name, services + numServices); @@ -400,11 +406,14 @@ static int getServices(struct service **servicesPtr, int *numServicesPtr, fprintf(stderr, _("error reading info for service %s: %s\n"), ent->d_name, strerror(errno)); closedir(dir); + freeServices(&services, numServicesAlloced); return 2; } else if (!rc) numServices++; } + closedir(dir); + if (err) { fprintf(stderr, _("error reading from directory %s: %s\n"), XINETDDIR, strerror(err));