From 98930eebc442757a81fda2bc92e94132f7dc87a6 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 3 Mar 2018 00:12:59 -0600 Subject: [PATCH 1/4] strcpy() -> strncpy() changes from Bruce Hill Also added some additional static assertions for string field sizes. --- src/std/rec/stringinRecord.c | 5 +++-- src/std/rec/stringoutRecord.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/std/rec/stringinRecord.c b/src/std/rec/stringinRecord.c index 19f55866a..db2f626f1 100644 --- a/src/std/rec/stringinRecord.c +++ b/src/std/rec/stringinRecord.c @@ -93,6 +93,7 @@ static long readValue(stringinRecord *); static long init_record(stringinRecord *prec, int pass) { STATIC_ASSERT(sizeof(prec->oval)==sizeof(prec->val)); + STATIC_ASSERT(sizeof(prec->sval)==sizeof(prec->val)); struct stringindset *pdset; long status; @@ -119,7 +120,7 @@ static long init_record(stringinRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strcpy(prec->oval,prec->val); + strncpy(prec->oval, prec->val, sizeof(prec->val)); return(0); } @@ -193,7 +194,7 @@ static long readValue(stringinRecord *prec) status=dbGetLink(&(prec->siol),DBR_STRING, prec->sval,0,0); if (status==0) { - strcpy(prec->val,prec->sval); + strncpy(prec->val, prec->sval, sizeof(prec->val)); prec->udf=FALSE; } } else { diff --git a/src/std/rec/stringoutRecord.c b/src/std/rec/stringoutRecord.c index ea9012911..2bca3228c 100644 --- a/src/std/rec/stringoutRecord.c +++ b/src/std/rec/stringoutRecord.c @@ -95,6 +95,7 @@ static long writeValue(stringoutRecord *); static long init_record(stringoutRecord *prec, int pass) { STATIC_ASSERT(sizeof(prec->oval)==sizeof(prec->val)); + STATIC_ASSERT(sizeof(prec->ivov)==sizeof(prec->val)); struct stringoutdset *pdset; long status=0; @@ -121,7 +122,7 @@ static long init_record(stringoutRecord *prec, int pass) if( pdset->init_record ) { if((status=(*pdset->init_record)(prec))) return(status); } - strcpy(prec->oval,prec->val); + strncpy(prec->oval, prec->val, sizeof(prec->val)); return(0); } @@ -159,7 +160,7 @@ static long process(stringoutRecord *prec) break; case (menuIvoaSet_output_to_IVOV) : if(prec->pact == FALSE){ - strcpy(prec->val,prec->ivov); + strncpy(prec->val, prec->ivov, sizeof(prec->val)); } status=writeValue(prec); /* write the new value */ break; From 8eb4eec7d28eaa8950be95b05cfd551897b4b69a Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 3 Mar 2018 17:17:34 -0600 Subject: [PATCH 2/4] Corrected fix from Bruce Hill's Github PR#19 --- configure/RULES_BUILD | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configure/RULES_BUILD b/configure/RULES_BUILD index 6d2a5cd55..1b7e5dc25 100644 --- a/configure/RULES_BUILD +++ b/configure/RULES_BUILD @@ -170,8 +170,9 @@ ifdef RES @$(RM) *$(RES) endif -$(DIRECTORY_TARGETS) : - $(MKDIR) -p $@ +# Sort mkdir targets to remove duplicates & make parents first +$(DIRECTORY_TARGETS): + $(MKDIR) $(sort $@) # Install LIB_INSTALLS libraries before linking executables $(TESTPRODNAME) $(PRODNAME): | $(INSTALL_LIB_INSTALLS) From 98d9ea45451e43125d3b3eb3da31b48afa1b9cbc Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sun, 4 Mar 2018 15:45:15 -0600 Subject: [PATCH 3/4] ca/client: Catch by reference, missing '&' --- src/ca/client/oldChannelNotify.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ca/client/oldChannelNotify.cpp b/src/ca/client/oldChannelNotify.cpp index 5775bcc6b..701f51fc1 100644 --- a/src/ca/client/oldChannelNotify.cpp +++ b/src/ca/client/oldChannelNotify.cpp @@ -390,7 +390,7 @@ int epicsShareAPI ca_array_get_callback ( chtype type, { caStatus = ECA_ALLOCMEM; } - catch ( cacChannel::msgBodyCacheTooSmall ) { + catch ( cacChannel::msgBodyCacheTooSmall & ) { caStatus = ECA_TOLARGE; } catch ( ... ) From a9764c8f62ca49150c6bc1e68777b011b50e5604 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sun, 4 Mar 2018 15:51:39 -0600 Subject: [PATCH 4/4] tools/caput: Report errors from ca_array_put*() Fixes LP: #1747983 --- src/ca/client/tools/caput.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ca/client/tools/caput.c b/src/ca/client/tools/caput.c index 9c50cd9df..5e4d10e23 100644 --- a/src/ca/client/tools/caput.c +++ b/src/ca/client/tools/caput.c @@ -8,7 +8,7 @@ * Copyright (c) 2002 Berliner Elektronenspeicherringgesellschaft fuer * Synchrotronstrahlung. * EPICS BASE is distributed subject to a Software License Agreement found -* in file LICENSE that is included with this distribution. +* in file LICENSE that is included with this distribution. \*************************************************************************/ /* @@ -419,7 +419,7 @@ int main (int argc, char *argv[]) if (argc > optind+1) { for (i = optind + 1; i < argc; i++) { strcat(cbuf, " "); - strcat(cbuf, argv[i]); + strcat(cbuf, argv[i]); } } @@ -530,6 +530,11 @@ int main (int argc, char *argv[]) /* Use standard put with defined timeout */ result = ca_array_put (dbrType, count, pvs[0].chid, pbuf); } + if (result != ECA_NORMAL) { + fprintf(stderr, "Error from put operation: %s\n", ca_message(result)); + return 1; + } + result = ca_pend_io(caTimeout); if (result == ECA_TIMEOUT) { fprintf(stderr, "Write operation timed out: Data was not written.\n"); @@ -545,7 +550,7 @@ int main (int argc, char *argv[]) } if (result != ECA_NORMAL) { - fprintf(stderr, "Error occured writing data.\n"); + fprintf(stderr, "Error occured writing data: %s\n", ca_message(result)); return 1; }