bugfix: dbGet should not crash because of empty array requests

This commit is contained in:
2020-02-13 22:06:44 +01:00
committed by Andrew Johnson
parent e0dfb6cff8
commit 39c8d5619a
2 changed files with 17 additions and 19 deletions

View File

@@ -1001,6 +1001,11 @@ long dbGet(DBADDR *paddr, short dbrType,
} else {
DBADDR localAddr = *paddr; /* Structure copy */
if (pfl->no_elements < 1) {
status = S_db_badField;
goto done;
}
localAddr.field_type = pfl->field_type;
localAddr.field_size = pfl->field_size;
localAddr.no_elements = pfl->no_elements;

View File

@@ -101,12 +101,6 @@ long dbDbInitLink(struct link *plink, short dbfType)
precord = dbChannelRecord(chan);
if (dbChannelFinalElements(chan) < 1) {
errlogPrintf("Warning: %s.%s=%s has %ld elements. This will not work.\n",
plink->precord->name, dbLinkFieldName(plink),
dbChannelName(chan), dbChannelFinalElements(chan));
}
plink->lset = &dbDb_lset;
plink->type = DB_LINK;
plink->value.pv_link.pvt = chan;
@@ -122,12 +116,6 @@ long dbDbInitLink(struct link *plink, short dbfType)
void dbDbAddLink(struct dbLocker *locker, struct link *plink, short dbfType,
dbChannel *chan)
{
if (dbChannelFinalElements(chan) < 1) {
errlogPrintf("Warning: %s.%s=%s has %ld elements. This will not work.\n",
plink->precord->name, dbLinkFieldName(plink),
dbChannelName(chan), dbChannelFinalElements(chan));
}
plink->lset = &dbDb_lset;
plink->type = DB_LINK;
plink->value.pv_link.pvt = chan;
@@ -197,15 +185,20 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
fl.ctx = dbfl_context_read;
fl.type = dbfl_type_rec;
if (dbChannelFinalElements(chan) < 1)
/* For the moment, empty arrays are not supported by EPICS */
if (dbChannelFinalElements(chan) > 0)
{
recGblSetSevr(precord, LINK_ALARM, UDF_ALARM);
return S_db_badField;
dbChannelRunPreChain(chan, &fl);
dbChannelRunPostChain(chan, &fl);
status = dbChannelGet(chan, dbrType, pbuffer, &options, pnRequest, &fl);
if (!status && pnRequest && *pnRequest <= 0)
status = S_db_badField;
} else {
status = S_db_badField;
}
if (status) {
recGblSetSevr(precord, LINK_ALARM, UDF_ALARM);
}
dbChannelRunPreChain(chan, &fl);
dbChannelRunPostChain(chan, &fl);
status = dbChannelGet(chan, dbrType, pbuffer, &options, pnRequest, &fl);
} else if (ppv_link->getCvt && ppv_link->lastGetdbrType == dbrType) {
status = ppv_link->getCvt(dbChannelField(chan), pbuffer, paddr);
} else {