iocsh: Add protection if realloc() fails

This commit is contained in:
Andrew Johnson
2018-12-06 16:35:30 -06:00
parent ee90dffd40
commit 49f5527cd7
+14 -16
View File
@@ -599,12 +599,12 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros)
macPushScope(handle);
macInstallMacros(handle, defines);
wasOkToBlock = epicsThreadIsOkToBlock();
epicsThreadSetOkToBlock(1);
/*
* Read commands till EOF or exit
*/
argc = 0;
wasOkToBlock = epicsThreadIsOkToBlock();
epicsThreadSetOkToBlock(1);
for (;;) {
/*
* Read a line
@@ -676,15 +676,15 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros)
redirect = NULL;
for (;;) {
if (argc >= argvCapacity) {
char **av;
argvCapacity += 50;
av = (char **)realloc (argv, argvCapacity * sizeof *argv);
if (av == NULL) {
int newCapacity = argvCapacity + 20;
char **newv = (char **)realloc (argv, newCapacity * sizeof *argv);
if (newv == NULL) {
fprintf (epicsGetStderr(), "Out of memory!\n");
argc = -1;
break;
}
argv = av;
argv = newv;
argvCapacity = newCapacity;
}
c = line[icin++];
if (c == '\0')
@@ -833,16 +833,14 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros)
break;
}
if (iarg >= argBufCapacity) {
void *np;
argBufCapacity += 20;
np = realloc (argBuf, argBufCapacity * sizeof *argBuf);
if (np == NULL) {
int newCapacity = argBufCapacity + 20;
void *newBuf = realloc(argBuf, newCapacity * sizeof *argBuf);
if (newBuf == NULL) {
fprintf (epicsGetStderr(), "Out of memory!\n");
argBufCapacity -= 20;
break;
}
argBuf = (iocshArgBuf *)np;
argBuf = (iocshArgBuf *) newBuf;
argBufCapacity = newCapacity;
}
if (piocshFuncDef->arg[iarg]->type == iocshArgArgv) {
argBuf[iarg].aval.ac = argc-iarg;
@@ -887,7 +885,7 @@ iocshBody (const char *pathname, const char *commandLine, const char *macros)
errlogFlush();
if (readlineContext)
epicsReadlineEnd(readlineContext);
epicsThreadSetOkToBlock( wasOkToBlock);
epicsThreadSetOkToBlock(wasOkToBlock);
return 0;
}