From 2340c6e6c1a3b34526108fc84f0220fadd052146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kriszti=C3=A1n=20L=C3=B6ki?= Date: Thu, 25 Feb 2021 14:54:07 +0100 Subject: [PATCH] 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. --- modules/database/src/std/rec/compressRecord.c | 5 +++-- modules/database/src/std/rec/histogramRecord.c | 4 ++-- modules/database/src/std/rec/subArrayRecord.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/database/src/std/rec/compressRecord.c b/modules/database/src/std/rec/compressRecord.c index 98e17985f..d7da7f9b6 100644 --- a/modules/database/src/std/rec/compressRecord.c +++ b/modules/database/src/std/rec/compressRecord.c @@ -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; diff --git a/modules/database/src/std/rec/histogramRecord.c b/modules/database/src/std/rec/histogramRecord.c index 0e9724cb6..bc618df2e 100644 --- a/modules/database/src/std/rec/histogramRecord.c +++ b/modules/database/src/std/rec/histogramRecord.c @@ -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; diff --git a/modules/database/src/std/rec/subArrayRecord.c b/modules/database/src/std/rec/subArrayRecord.c index 82e543ca7..b73dee16b 100644 --- a/modules/database/src/std/rec/subArrayRecord.c +++ b/modules/database/src/std/rec/subArrayRecord.c @@ -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; }