Allow changing the BPTR field
This fixes github issue #97: Reading into an aai record from a compress or histogram or subArray record could cause a segfault if the aai record was initialized before the linked one.
This commit is contained in:
@@ -106,7 +106,7 @@ static void monitor(compressRecord *prec)
|
||||
db_post_events(prec, &prec->nuse, monitor_mask);
|
||||
prec->ouse = prec->nuse;
|
||||
}
|
||||
db_post_events(prec, prec->bptr, monitor_mask);
|
||||
db_post_events(prec, (void*)&prec->val, monitor_mask);
|
||||
}
|
||||
|
||||
static void put_value(compressRecord *prec, double *psource, int n)
|
||||
@@ -404,7 +404,6 @@ static long cvt_dbaddr(DBADDR *paddr)
|
||||
{
|
||||
compressRecord *prec = (compressRecord *) paddr->precord;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
paddr->no_elements = prec->nsam;
|
||||
paddr->field_type = DBF_DOUBLE;
|
||||
paddr->field_size = sizeof(double);
|
||||
@@ -426,6 +425,8 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
epicsUInt32 off = prec->off;
|
||||
epicsUInt32 nuse = prec->nuse;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
|
||||
if (prec->balg == bufferingALG_FIFO) {
|
||||
epicsUInt32 nsam = prec->nsam;
|
||||
|
||||
|
||||
@@ -291,7 +291,7 @@ static void monitor(histogramRecord *prec)
|
||||
}
|
||||
/* send out monitors connected to the value field */
|
||||
if (monitor_mask)
|
||||
db_post_events(prec, prec->bptr, monitor_mask);
|
||||
db_post_events(prec, (void*)&prec->val, monitor_mask);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -300,7 +300,6 @@ static long cvt_dbaddr(DBADDR *paddr)
|
||||
{
|
||||
histogramRecord *prec = (histogramRecord *) paddr->precord;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
paddr->no_elements = prec->nelm;
|
||||
paddr->field_type = DBF_ULONG;
|
||||
paddr->field_size = sizeof(epicsUInt32);
|
||||
@@ -312,6 +311,7 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
{
|
||||
histogramRecord *prec = (histogramRecord *) paddr->precord;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
*no_elements = prec->nelm;
|
||||
*offset = 0;
|
||||
return 0;
|
||||
|
||||
@@ -161,7 +161,6 @@ static long cvt_dbaddr(DBADDR *paddr)
|
||||
{
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
paddr->no_elements = prec->malm;
|
||||
paddr->field_type = prec->ftvl;
|
||||
paddr->field_size = dbValueSize(prec->ftvl);
|
||||
@@ -174,6 +173,7 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
{
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
|
||||
paddr->pfield = prec->bptr;
|
||||
if (prec->udf)
|
||||
*no_elements = 0;
|
||||
else
|
||||
@@ -293,7 +293,7 @@ static void monitor(subArrayRecord *prec)
|
||||
monitor_mask = recGblResetAlarms(prec);
|
||||
monitor_mask |= (DBE_LOG|DBE_VALUE);
|
||||
|
||||
db_post_events(prec, prec->bptr, monitor_mask);
|
||||
db_post_events(prec, (void*)&prec->val, monitor_mask);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user