From 81550ac4d3b532ca78824ae48059e7ef4e3d6f01 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Thu, 14 Nov 2019 10:11:16 -0500 Subject: [PATCH 1/3] Fix segfault when calling dbLoadRecords after iocInit This fixes lp:1829919. --- src/ioc/db/dbAccess.c | 15 ++++++++++++--- src/ioc/dbStatic/dbLexRoutines.c | 10 ++++++++++ src/ioc/dbStatic/dbStaticIocRegister.c | 8 ++++++++ src/ioc/dbStatic/dbStaticPvt.h | 1 + 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/ioc/db/dbAccess.c b/src/ioc/db/dbAccess.c index 4ee2d677d..0b893eeb9 100644 --- a/src/ioc/db/dbAccess.c +++ b/src/ioc/db/dbAccess.c @@ -730,9 +730,18 @@ int dbLoadDatabase(const char *file, const char *path, const char *subs) int dbLoadRecords(const char* file, const char* subs) { int status = dbReadDatabase(&pdbbase, file, 0, subs); - - if (!status && dbLoadRecordsHook) - dbLoadRecordsHook(file, subs); + switch(status) + { + case 0: + if(dbLoadRecordsHook) + dbLoadRecordsHook(file, subs); + break; + case -2: + errlogPrintf("dbLoadRecords: failed to load %s - cannot load records after running iocBuild!\n", file); + break; + default: + errlogPrintf("dbLoadRecords: failed to load %s\n", file); + } return status; } diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 3df3c7f3a..9bc0f8722 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "dbDefs.h" #include "dbmf.h" @@ -115,6 +116,12 @@ typedef struct tempListNode { static ELLLIST tempList = ELLLIST_INIT; static void *freeListPvt = NULL; static int duplicate = FALSE; +static bool dbLoadRecordsAllowed = true; + +void disableDbLoadRecords() +{ + dbLoadRecordsAllowed = false; +} static void yyerrorAbort(char *str) { @@ -215,6 +222,9 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, char *penv; char **macPairs; + if(!dbLoadRecordsAllowed) + return -2; + if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; if(path && strlen(path)>0) { diff --git a/src/ioc/dbStatic/dbStaticIocRegister.c b/src/ioc/dbStatic/dbStaticIocRegister.c index 18d346c70..7156691ac 100644 --- a/src/ioc/dbStatic/dbStaticIocRegister.c +++ b/src/ioc/dbStatic/dbStaticIocRegister.c @@ -8,12 +8,19 @@ \*************************************************************************/ #include "iocsh.h" +#include "initHooks.h" #define epicsExportSharedSymbols #include "dbStaticIocRegister.h" #include "dbStaticLib.h" #include "dbStaticPvt.h" +static void dbStaticIocRegisterInitHook(initHookState state) +{ + if(state == initHookAtIocBuild) + disableDbLoadRecords(); +} + /* common arguments */ static const iocshArg argPdbbase = { "pdbbase", iocshArgPdbbase}; @@ -153,6 +160,7 @@ static void dbReportDeviceConfigCallFunc(const iocshArgBuf *args) void dbStaticIocRegister(void) { + initHookRegister(dbStaticIocRegisterInitHook); iocshRegister(&dbDumpPathFuncDef, dbDumpPathCallFunc); iocshRegister(&dbDumpRecordFuncDef, dbDumpRecordCallFunc); iocshRegister(&dbDumpMenuFuncDef, dbDumpMenuCallFunc); diff --git a/src/ioc/dbStatic/dbStaticPvt.h b/src/ioc/dbStatic/dbStaticPvt.h index 842c0dc21..62e595e02 100644 --- a/src/ioc/dbStatic/dbStaticPvt.h +++ b/src/ioc/dbStatic/dbStaticPvt.h @@ -25,6 +25,7 @@ dbDeviceMenu *dbGetDeviceMenu(DBENTRY *pdbentry); void dbFreeLinkContents(struct link *plink); void dbFreePath(DBBASE *pdbbase); int dbIsMacroOk(DBENTRY *pdbentry); +void disableDbLoadRecords(); /*The following routines have different versions for run-time no-run-time*/ long dbAllocRecord(DBENTRY *pdbentry,const char *precordName); From 6767bcd31e2335e13fc1f3e548fe54b122d5527b Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Thu, 14 Nov 2019 13:57:45 -0500 Subject: [PATCH 2/3] Use accessor in iocInit This is simpler than using init hooks. --- src/ioc/dbStatic/dbLexRoutines.c | 10 ++-------- src/ioc/dbStatic/dbStaticIocRegister.c | 8 -------- src/ioc/dbStatic/dbStaticPvt.h | 1 - src/ioc/misc/iocInit.c | 9 ++++++--- src/ioc/misc/iocInit.h | 5 +++++ 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 9bc0f8722..b5f94674f 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -16,7 +16,6 @@ #include #include #include -#include #include "dbDefs.h" #include "dbmf.h" @@ -27,6 +26,7 @@ #include "freeList.h" #include "gpHash.h" #include "macLib.h" +#include "iocInit.h" #define epicsExportSharedSymbols #include "dbBase.h" @@ -116,12 +116,6 @@ typedef struct tempListNode { static ELLLIST tempList = ELLLIST_INIT; static void *freeListPvt = NULL; static int duplicate = FALSE; -static bool dbLoadRecordsAllowed = true; - -void disableDbLoadRecords() -{ - dbLoadRecordsAllowed = false; -} static void yyerrorAbort(char *str) { @@ -222,7 +216,7 @@ static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, char *penv; char **macPairs; - if(!dbLoadRecordsAllowed) + if(getIocState() != iocVirgin) return -2; if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); diff --git a/src/ioc/dbStatic/dbStaticIocRegister.c b/src/ioc/dbStatic/dbStaticIocRegister.c index 7156691ac..18d346c70 100644 --- a/src/ioc/dbStatic/dbStaticIocRegister.c +++ b/src/ioc/dbStatic/dbStaticIocRegister.c @@ -8,19 +8,12 @@ \*************************************************************************/ #include "iocsh.h" -#include "initHooks.h" #define epicsExportSharedSymbols #include "dbStaticIocRegister.h" #include "dbStaticLib.h" #include "dbStaticPvt.h" -static void dbStaticIocRegisterInitHook(initHookState state) -{ - if(state == initHookAtIocBuild) - disableDbLoadRecords(); -} - /* common arguments */ static const iocshArg argPdbbase = { "pdbbase", iocshArgPdbbase}; @@ -160,7 +153,6 @@ static void dbReportDeviceConfigCallFunc(const iocshArgBuf *args) void dbStaticIocRegister(void) { - initHookRegister(dbStaticIocRegisterInitHook); iocshRegister(&dbDumpPathFuncDef, dbDumpPathCallFunc); iocshRegister(&dbDumpRecordFuncDef, dbDumpRecordCallFunc); iocshRegister(&dbDumpMenuFuncDef, dbDumpMenuCallFunc); diff --git a/src/ioc/dbStatic/dbStaticPvt.h b/src/ioc/dbStatic/dbStaticPvt.h index 62e595e02..842c0dc21 100644 --- a/src/ioc/dbStatic/dbStaticPvt.h +++ b/src/ioc/dbStatic/dbStaticPvt.h @@ -25,7 +25,6 @@ dbDeviceMenu *dbGetDeviceMenu(DBENTRY *pdbentry); void dbFreeLinkContents(struct link *plink); void dbFreePath(DBBASE *pdbbase); int dbIsMacroOk(DBENTRY *pdbentry); -void disableDbLoadRecords(); /*The following routines have different versions for run-time no-run-time*/ long dbAllocRecord(DBENTRY *pdbentry,const char *precordName); diff --git a/src/ioc/misc/iocInit.c b/src/ioc/misc/iocInit.c index a45770d9e..93d8908a8 100644 --- a/src/ioc/misc/iocInit.c +++ b/src/ioc/misc/iocInit.c @@ -70,9 +70,7 @@ #include "registryRecordType.h" #include "rsrv.h" -static enum { - iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped -} iocState = iocVirgin; +static enum iocStateEnum iocState = iocVirgin; static enum { buildRSRV, buildIsolated } iocBuildMode; @@ -91,6 +89,11 @@ static void exitDatabase(void *dummy); int dbThreadRealtimeLock = 1; epicsExportAddress(int, dbThreadRealtimeLock); +enum iocStateEnum getIocState(void) +{ + return iocState; +} + /* * Initialize EPICS on the IOC. */ diff --git a/src/ioc/misc/iocInit.h b/src/ioc/misc/iocInit.h index 24ae45e06..3e711d6c5 100644 --- a/src/ioc/misc/iocInit.h +++ b/src/ioc/misc/iocInit.h @@ -13,10 +13,15 @@ #include "shareLib.h" +enum iocStateEnum { + iocVirgin, iocBuilding, iocBuilt, iocRunning, iocPaused, iocStopped +}; + #ifdef __cplusplus extern "C" { #endif +epicsShareFunc enum iocStateEnum getIocState(void); epicsShareFunc int iocInit(void); epicsShareFunc int iocBuild(void); epicsShareFunc int iocBuildIsolated(void); From a50b850ebdb4ef7ebb2906e090513bc618085a18 Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Fri, 15 Nov 2019 09:33:15 -0500 Subject: [PATCH 3/3] Fix mingw cross-build --- src/ioc/dbStatic/dbLexRoutines.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index b5f94674f..2be7b0d0c 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -26,7 +26,6 @@ #include "freeList.h" #include "gpHash.h" #include "macLib.h" -#include "iocInit.h" #define epicsExportSharedSymbols #include "dbBase.h" @@ -36,6 +35,7 @@ #include "epicsExport.h" #include "link.h" #include "special.h" +#include "iocInit.h"