From b63e381fbefd0336cb3109f9af4c5cfa757ae1d2 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 5 Apr 2010 14:49:18 -0400 Subject: [PATCH 1/2] rec: update last/prev./old value fields after dset init_record This must be done if init_record is allowed to change values or monitors may not be posted when values change. --- src/rec/aSubRecord.c | 2 ++ src/rec/aiRecord.c | 4 ++++ src/rec/aoRecord.c | 5 +++++ src/rec/biRecord.c | 3 +++ src/rec/boRecord.c | 5 +++++ src/rec/calcoutRecord.c | 5 +++++ src/rec/longinRecord.c | 3 +++ src/rec/longoutRecord.c | 3 +++ src/rec/mbbiDirectRecord.c | 3 +++ src/rec/mbbiRecord.c | 3 +++ src/rec/mbboDirectRecord.c | 4 ++++ src/rec/mbboRecord.c | 4 ++++ src/rec/stringinRecord.c | 1 + src/rec/stringoutRecord.c | 1 + src/rec/subRecord.c | 3 +++ 15 files changed, 49 insertions(+) diff --git a/src/rec/aSubRecord.c b/src/rec/aSubRecord.c index 77eb6c54f..f3c5ce4c6 100644 --- a/src/rec/aSubRecord.c +++ b/src/rec/aSubRecord.c @@ -210,6 +210,8 @@ static long init_record(aSubRecord *prec, int pass) return S_db_BadSub; } } + strcpy(prec->onam, prec->snam); + prec->oval = prec->val; return 0; } diff --git a/src/rec/aiRecord.c b/src/rec/aiRecord.c index f1de6e55a..6cb440f8d 100644 --- a/src/rec/aiRecord.c +++ b/src/rec/aiRecord.c @@ -145,6 +145,10 @@ static long init_record(void *precord,int pass) } return (status); } + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; return(0); } diff --git a/src/rec/aoRecord.c b/src/rec/aoRecord.c index d896b4904..33bfc4730 100644 --- a/src/rec/aoRecord.c +++ b/src/rec/aoRecord.c @@ -166,6 +166,11 @@ static long init_record(aoRecord *prec, int pass) } } prec->oval = prec->pval = prec->val; + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; + prec->orbv = prec->rbv; return(0); } diff --git a/src/rec/biRecord.c b/src/rec/biRecord.c index 7a6251f9f..8192bee2a 100644 --- a/src/rec/biRecord.c +++ b/src/rec/biRecord.c @@ -110,6 +110,9 @@ static long init_record(biRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; return(0); } diff --git a/src/rec/boRecord.c b/src/rec/boRecord.c index b66567f69..b0c45daed 100644 --- a/src/rec/boRecord.c +++ b/src/rec/boRecord.c @@ -177,6 +177,11 @@ static long init_record(boRecord *prec,int pass) if(prec->val==0) prec->rval = 0; else prec->rval = prec->mask; } else prec->rval = (epicsUInt32)prec->val; + + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; + prec->orbv = prec->rbv; return(status); } diff --git a/src/rec/calcoutRecord.c b/src/rec/calcoutRecord.c index 2a1a4fb75..f49c699d8 100644 --- a/src/rec/calcoutRecord.c +++ b/src/rec/calcoutRecord.c @@ -198,6 +198,11 @@ static long init_record(calcoutRecord *prec, int pass) prpvt->cbScheduled = 0; if (pcalcoutDSET->init_record) pcalcoutDSET->init_record(prec); + prec->pval = prec->val; + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; + prec->povl = prec->oval; return 0; } diff --git a/src/rec/longinRecord.c b/src/rec/longinRecord.c index 830e411a2..56904d1a5 100644 --- a/src/rec/longinRecord.c +++ b/src/rec/longinRecord.c @@ -121,6 +121,9 @@ static long init_record(longinRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; return(0); } diff --git a/src/rec/longoutRecord.c b/src/rec/longoutRecord.c index 2a3b87a95..1de82e3ba 100644 --- a/src/rec/longoutRecord.c +++ b/src/rec/longoutRecord.c @@ -117,6 +117,9 @@ static long init_record(longoutRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; return(0); } diff --git a/src/rec/mbbiDirectRecord.c b/src/rec/mbbiDirectRecord.c index 86b88b595..51ee7de92 100644 --- a/src/rec/mbbiDirectRecord.c +++ b/src/rec/mbbiDirectRecord.c @@ -158,6 +158,9 @@ static long init_record(mbbiDirectRecord *prec, int pass) if((status=(*pdset->init_record)(prec))) return(status); refresh_bits(prec, 0); } + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; return(0); } diff --git a/src/rec/mbbiRecord.c b/src/rec/mbbiRecord.c index ed29ce1dc..ae7b7411e 100644 --- a/src/rec/mbbiRecord.c +++ b/src/rec/mbbiRecord.c @@ -135,6 +135,9 @@ static long init_record(mbbiRecord *prec, int pass) if((status=(*pdset->init_record)(prec))) return(status); } init_common(prec); + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; return(0); } diff --git a/src/rec/mbboDirectRecord.c b/src/rec/mbboDirectRecord.c index ec128813c..83a89fa87 100644 --- a/src/rec/mbboDirectRecord.c +++ b/src/rec/mbboDirectRecord.c @@ -141,6 +141,10 @@ static long init_record(mbboDirectRecord *prec, int pass) prec->udf = FALSE; } else if (status == 2) status = 0; } + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; + prec->orbv = prec->rbv; return(status); } diff --git a/src/rec/mbboRecord.c b/src/rec/mbboRecord.c index afaeecfab..74ae040cd 100644 --- a/src/rec/mbboRecord.c +++ b/src/rec/mbboRecord.c @@ -184,6 +184,10 @@ static long init_record(mbboRecord *prec, int pass) init_common(prec); /* convert val to rval */ convert(prec); + prec->mlst = prec->val; + prec->lalm = prec->val; + prec->oraw = prec->rval; + prec->orbv = prec->rbv; return(0); } diff --git a/src/rec/stringinRecord.c b/src/rec/stringinRecord.c index 6bb98b438..dc5fde6f3 100644 --- a/src/rec/stringinRecord.c +++ b/src/rec/stringinRecord.c @@ -119,6 +119,7 @@ static long init_record(stringinRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } + strncpy(prec->oval,prec->val,sizeof(prec->val)); return(0); } diff --git a/src/rec/stringoutRecord.c b/src/rec/stringoutRecord.c index 41b0d6899..a1c3f90f6 100644 --- a/src/rec/stringoutRecord.c +++ b/src/rec/stringoutRecord.c @@ -121,6 +121,7 @@ static long init_record(stringoutRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } + strncpy(prec->oval,prec->val,sizeof(prec->val)); return(0); } diff --git a/src/rec/subRecord.c b/src/rec/subRecord.c index 61f4606ae..195097671 100644 --- a/src/rec/subRecord.c +++ b/src/rec/subRecord.c @@ -127,6 +127,9 @@ static long init_record(subRecord *prec, int pass) recGblRecordError(S_db_BadSub, (void *)prec, "recSub(init_record)"); return S_db_BadSub; } + prec->mlst = prec->val; + prec->alst = prec->val; + prec->lalm = prec->val; return 0; } From e8f56d08b8e6f6baa12fd9c9a1892deaa503afbb Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 6 Apr 2010 14:48:48 -0400 Subject: [PATCH 2/2] Ensure the string VAL and OVAL have the same storage length There won't be any problems with overflow as long as dbPut behaves correctly when setting VAL. --- src/rec/aSubRecord.c | 1 + src/rec/stringinRecord.c | 7 ++++--- src/rec/stringoutRecord.c | 7 ++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/rec/aSubRecord.c b/src/rec/aSubRecord.c index f3c5ce4c6..455f803cf 100644 --- a/src/rec/aSubRecord.c +++ b/src/rec/aSubRecord.c @@ -210,6 +210,7 @@ static long init_record(aSubRecord *prec, int pass) return S_db_BadSub; } } + STATIC_ASSERT(sizeof(prec->onam)==sizeof(prec->snam)); strcpy(prec->onam, prec->snam); prec->oval = prec->val; return 0; diff --git a/src/rec/stringinRecord.c b/src/rec/stringinRecord.c index dc5fde6f3..5bff99c8c 100644 --- a/src/rec/stringinRecord.c +++ b/src/rec/stringinRecord.c @@ -119,7 +119,8 @@ static long init_record(stringinRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strncpy(prec->oval,prec->val,sizeof(prec->val)); + STATIC_ASSERT(sizeof(prec->oval)==sizeof(prec->val)); + strcpy(prec->oval,prec->val); return(0); } @@ -158,9 +159,9 @@ static void monitor(stringinRecord *prec) unsigned short monitor_mask; monitor_mask = recGblResetAlarms(prec); - if(strncmp(prec->oval,prec->val,sizeof(prec->val))) { + if(strcmp(prec->oval,prec->val)) { monitor_mask |= DBE_VALUE|DBE_LOG; - strncpy(prec->oval,prec->val,sizeof(prec->val)); + strcpy(prec->oval,prec->val); } if (prec->mpst == stringinPOST_Always) monitor_mask |= DBE_VALUE; diff --git a/src/rec/stringoutRecord.c b/src/rec/stringoutRecord.c index a1c3f90f6..d62fe2479 100644 --- a/src/rec/stringoutRecord.c +++ b/src/rec/stringoutRecord.c @@ -121,7 +121,8 @@ static long init_record(stringoutRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strncpy(prec->oval,prec->val,sizeof(prec->val)); + STATIC_ASSERT(sizeof(prec->oval)==sizeof(prec->val)); + strcpy(prec->oval,prec->val); return(0); } @@ -186,9 +187,9 @@ static void monitor(stringoutRecord *prec) unsigned short monitor_mask; monitor_mask = recGblResetAlarms(prec); - if(strncmp(prec->oval,prec->val,sizeof(prec->val))) { + if(strcmp(prec->oval,prec->val)) { monitor_mask |= DBE_VALUE|DBE_LOG; - strncpy(prec->oval,prec->val,sizeof(prec->val)); + strcpy(prec->oval,prec->val); } if (prec->mpst == stringoutPOST_Always) monitor_mask |= DBE_VALUE;