From 49f5527cd7bc74949910f8955f855bfe1b45788b Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 6 Dec 2018 16:35:30 -0600 Subject: [PATCH] iocsh: Add protection if realloc() fails --- src/libCom/iocsh/iocsh.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/libCom/iocsh/iocsh.cpp b/src/libCom/iocsh/iocsh.cpp index ef646158e..03d4c28b4 100644 --- a/src/libCom/iocsh/iocsh.cpp +++ b/src/libCom/iocsh/iocsh.cpp @@ -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; }