iocsh: Add protection if realloc() fails
This commit is contained in:
+14
-16
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user