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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user