bugfix: dbGet should not crash because of empty array requests
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user