Low-memory behaviour fixes.

Fix unchecked buffer allocation in dbChannel.c
Replace calls to epicsStrDup() with checked malloc() for
things that happen often after iocInit.

Michael Davidsaver pointed out this issue.
This commit is contained in:
Andrew Johnson committed 2014-02-07 17:19:28 -06:00
1 parent 502366fdc3
commit e1e389a2dd
3 files changed
+14 -3

No files matched your search

+9 -1
View File
@@ -465,6 +465,7 @@ dbChannel * dbChannelCreate(const char *name)
const char *pname = name;
DBENTRY dbEntry;
dbChannel *chan = NULL;
char *cname;
dbAddr *paddr;
dbFldDes *pflddes;
long status;
@@ -478,7 +479,14 @@ dbChannel * dbChannelCreate(const char *name)
goto finish;
chan = freeListCalloc(dbChannelFreeList);
chan->name = epicsStrDup(name);
if (!chan)
goto finish;
cname = malloc(strlen(name) + 1);
if (!cname)
goto finish;
strcpy(cname, name);
chan->name = cname;
ellInit(&chan->filters);
ellInit(&chan->pre_chain);
ellInit(&chan->post_chain);
+3 -1
View File
@@ -2113,7 +2113,9 @@ long dbPutString(DBENTRY *pdbentry,const char *pstring)
return status;
}
/* store link text in case DTYP changes later */
plink->text = epicsStrDup(pstring);
plink->text = malloc(strlen(pstring) + 1);
if (plink->text)
strcpy(plink->text, pstring);
}
if (strlen(pstring) >= sizeof(string)) {
status = S_dbLib_badField;
+2 -1
View File
@@ -284,11 +284,12 @@ cvtArg (const char *filename, int lineno, char *arg, iocshArgBuf *argBuf,
break;
case iocshArgPersistentString:
argBuf->sval = epicsStrDup(arg);
argBuf->sval = (char *) malloc(strlen(arg) + 1);
if (argBuf->sval == NULL) {
showError(filename, lineno, "Out of memory");
return 0;
}
strcpy(argBuf->sval, arg);
break;
case iocshArgPdbbase: