plug memory leak resulting from record deletion

This commit is contained in:
Hinko Kocevar
2024-06-18 17:59:35 +02:00
committed by Andrew Johnson
parent 2f98251c9f
commit 39b0301062

View File

@ -1478,11 +1478,48 @@ long dbDeleteAliases(DBENTRY *pdbentry)
return 0;
}
static long dbDeleteRecordLinks(dbRecordType *rtyp, struct dbCommon *prec)
{
short i;
for (i=0; i<rtyp->no_links; i++) {
dbFldDes *pflddes = rtyp->papFldDes[rtyp->link_ind[i]];
DBLINK *plink = (DBLINK *)(((char *)prec) + pflddes->offset);
// TODO: How to handle different link types?
// switch (plink->type) {
// /* constantStr is allowed to remain NULL if plink->text==NULL
// * constantStr==NULL has special meaning in recGblInitConstantLink()
// */
// case CONSTANT: plink->value.constantStr = NULL; break;
// case PV_LINK: plink->value.pv_link.pvname = callocMustSucceed(1, 1, "init PV_LINK"); break;
// case JSON_LINK: plink->value.json.string = pNullString; break;
// case VME_IO: plink->value.vmeio.parm = pNullString; break;
// case CAMAC_IO: plink->value.camacio.parm = pNullString; break;
// case AB_IO: plink->value.abio.parm = pNullString; break;
// case GPIB_IO: plink->value.gpibio.parm = pNullString; break;
// case BITBUS_IO: plink->value.bitbusio.parm = pNullString; break;
// case INST_IO: plink->value.instio.string = pNullString; break;
// case BBGPIB_IO: plink->value.bbgpibio.parm = pNullString; break;
// case VXI_IO: plink->value.vxiio.parm = pNullString; break;
// }
if(!plink->text)
continue;
free(plink->text);
plink->text = NULL;
}
return 0;
}
long dbDeleteRecord(DBENTRY *pdbentry)
{
dbBase *pdbbase = pdbentry->pdbbase;
dbRecordType *precordType = pdbentry->precordType;
dbRecordNode *precnode = pdbentry->precnode;
struct dbCommon *prec = pdbentry->precnode->precord;
ELLLIST *preclist;
long status;
@ -1493,6 +1530,7 @@ long dbDeleteRecord(DBENTRY *pdbentry)
preclist = &precordType->recList;
ellDelete(preclist, &precnode->node);
dbPvdDelete(pdbbase, precnode);
dbDeleteRecordLinks(precordType, prec);
while (!dbFirstInfo(pdbentry)) {
dbDeleteInfo(pdbentry);
}