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
2014-02-07 17:19:28 -06:00
parent 502366fdc3
commit e1e389a2dd
3 changed files with 14 additions and 3 deletions
+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: