From c12a35e388f5ed04a0f294089658e5f8e70c41eb Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 7 Sep 2016 00:47:51 -0500 Subject: [PATCH] Clean up memory leaks --- src/ioc/db/dbJLink.c | 1 + src/ioc/db/dbLink.c | 2 ++ src/ioc/dbStatic/dbStaticLib.c | 10 ++++------ src/ioc/dbStatic/dbStaticPvt.h | 2 ++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ioc/db/dbJLink.c b/src/ioc/db/dbJLink.c index 8b2778511..a5939a6d5 100644 --- a/src/ioc/db/dbJLink.c +++ b/src/ioc/db/dbJLink.c @@ -385,6 +385,7 @@ long dbJLinkParse(const char *json, size_t jlen, short dbfType, err = yajl_get_error(yh, 1, (const unsigned char *) json, (unsigned) jlen); errlogPrintf("dbJLinkInit: %s\n", err); yajl_free_error(yh, err); + dbJLinkFree(parser->pjlink); /* fall through */ default: status = S_db_badField; diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index 054df88c9..bb74f91c6 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -177,6 +177,8 @@ void dbRemoveLink(struct dbLocker *locker, struct link *plink) plset->removeLink(locker, plink); plink->lset = NULL; } + if (plink->type == JSON_LINK) + plink->value.json.jlink = NULL; } int dbLinkIsDefined(const struct link *plink) diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index 89ab96d36..566f3cf74 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -2235,7 +2235,6 @@ long dbInitRecordLinks(dbRecordType *rtyp, struct dbCommon *prec) return 0; } -static void dbFreeLinkInfo(dbLinkInfo *pinfo) { if (pinfo->ltype == JSON_LINK) { @@ -2282,12 +2281,11 @@ long dbParseLink(const char *str, short ftype, dbLinkInfo *pinfo) /* Check for braces => JSON */ if (*str == '{' && str[len-1] == '}') { - long status = dbJLinkParse(str, len, ftype, &pinfo->jlink); + if (dbJLinkParse(str, len, ftype, &pinfo->jlink)) + goto fail; - if (!status) - pinfo->ltype = JSON_LINK; - - return status; + pinfo->ltype = JSON_LINK; + return 0; } /* Check for other HW link types */ diff --git a/src/ioc/dbStatic/dbStaticPvt.h b/src/ioc/dbStatic/dbStaticPvt.h index 3e2435e79..41a37429a 100644 --- a/src/ioc/dbStatic/dbStaticPvt.h +++ b/src/ioc/dbStatic/dbStaticPvt.h @@ -74,6 +74,8 @@ long dbCanSetLink(DBLINK *plink, dbLinkInfo *pinfo, devSup *devsup); * Unconditionally takes ownership of pinfo->target */ long dbSetLink(DBLINK *plink, dbLinkInfo *pinfo, devSup *dset); +/* Free dbLinkInfo storage */ +epicsShareFunc void dbFreeLinkInfo(dbLinkInfo *pinfo); /* The following is for path */ typedef struct dbPathNode {