From 6afe7f23b0440d3261fb99e3f7b4d56bd00713cc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 23 Mar 2001 03:44:50 +0000 Subject: [PATCH] got rid of dependency on alloca in popt --- popt/findme.c | 11 +++++++---- popt/popt.c | 12 ++++++++++-- popt/poptconfig.c | 15 ++++++++++----- popt/poptparse.c | 7 +++++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/popt/findme.c b/popt/findme.c index 6d1b41c1..f2ad05bb 100644 --- a/popt/findme.c +++ b/popt/findme.c @@ -9,7 +9,7 @@ const char * findProgramPath(const char * argv0) { char * path = getenv("PATH"); char * pathbuf; char * start, * chptr; - char * buf; + char * buf, *local = NULL; /* If there is a / in the argv[0], it has to be an absolute path */ @@ -18,7 +18,7 @@ const char * findProgramPath(const char * argv0) { if (!path) return NULL; - start = pathbuf = alloca(strlen(path) + 1); + local = start = pathbuf = malloc(strlen(path) + 1); buf = malloc(strlen(path) + strlen(argv0) + 2); strcpy(pathbuf, path); @@ -28,8 +28,10 @@ const char * findProgramPath(const char * argv0) { *chptr = '\0'; sprintf(buf, "%s/%s", start, argv0); - if (!access(buf, X_OK)) - return buf; + if (!access(buf, X_OK)) { + if (local) free(local); + return buf; + } if (chptr) start = chptr + 1; @@ -38,6 +40,7 @@ const char * findProgramPath(const char * argv0) { } while (start && *start); free(buf); + if (local) free(local); return NULL; } diff --git a/popt/popt.c b/popt/popt.c index ae608f19..aef79566 100644 --- a/popt/popt.c +++ b/popt/popt.c @@ -227,7 +227,7 @@ static void execCommand(poptContext con) { if (!con->execAbsolute && strchr(script, '/')) return; if (!strchr(script, '/') && con->execPath) { - char *s = alloca(strlen(con->execPath) + strlen(script) + 2); + char *s = malloc(strlen(con->execPath) + strlen(script) + 2); sprintf(s, "%s/%s", con->execPath, script); argv[pos] = s; } else { @@ -398,6 +398,14 @@ int poptGetNextOpt(poptContext con) const struct poptOption * opt = NULL; int done = 0; + /* looks a bit tricky to get rid of alloca properly in this fn */ +#if HAVE_ALLOCA_H +#define ALLOCA(x) alloca(x) +#else +#define ALLOCA(x) malloc(x) +#endif + + while (!done) { const char * origOptString = NULL; poptCallbackType cb = NULL; @@ -436,7 +444,7 @@ int poptGetNextOpt(poptContext con) /* Make a copy we can hack at */ localOptString = optString = - strcpy(alloca(strlen(origOptString) + 1), + strcpy(ALLOCA(strlen(origOptString) + 1), origOptString); if (!optString[0]) diff --git a/popt/poptconfig.c b/popt/poptconfig.c index 7a1a4c2b..eb769413 100644 --- a/popt/poptconfig.c +++ b/popt/poptconfig.c @@ -55,8 +55,8 @@ static void configLine(poptContext con, char * line) { } int poptReadConfigFile(poptContext con, const char * fn) { - char * file, * chptr, * end; - char * buf, * dst; + char * file=NULL, * chptr, * end; + char * buf=NULL, * dst; int fd, rc; int fileLength; @@ -71,16 +71,17 @@ int poptReadConfigFile(poptContext con, const char * fn) { fileLength = lseek(fd, 0, SEEK_END); (void) lseek(fd, 0, 0); - file = alloca(fileLength + 1); + file = malloc(fileLength + 1); if (read(fd, file, fileLength) != fileLength) { rc = errno; close(fd); errno = rc; + if (file) free(file); return POPT_ERROR_ERRNO; } close(fd); - dst = buf = alloca(fileLength + 1); + dst = buf = malloc(fileLength + 1); chptr = file; end = (file + fileLength); @@ -111,6 +112,9 @@ int poptReadConfigFile(poptContext con, const char * fn) { } } + free(file); + free(buf); + return 0; } @@ -125,10 +129,11 @@ int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv) { if (getuid() != geteuid()) return 0; if ((home = getenv("HOME"))) { - fn = alloca(strlen(home) + 20); + fn = malloc(strlen(home) + 20); strcpy(fn, home); strcat(fn, "/.popt"); rc = poptReadConfigFile(con, fn); + free(fn); if (rc) return rc; } diff --git a/popt/poptparse.c b/popt/poptparse.c index 7c9f06be..8f00769b 100644 --- a/popt/poptparse.c +++ b/popt/poptparse.c @@ -43,7 +43,8 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) const char ** argv = malloc(sizeof(*argv) * argvAlloced); int argc = 0; int buflen = strlen(s) + 1; - char * buf = memset(alloca(buflen), 0, buflen); + char *buf0 = calloc(buflen, 1); + char *buf = buf0; argv[argc] = buf; @@ -55,6 +56,7 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) src++; if (!*src) { free(argv); + free(buf0); return POPT_ERROR_BADQUOTE; } if (*src != quote) *buf++ = '\\'; @@ -78,6 +80,7 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) src++; if (!*src) { free(argv); + free(buf0); return POPT_ERROR_BADQUOTE; } /*@fallthrough@*/ @@ -94,6 +97,6 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr) (void) poptDupArgv(argc, argv, argcPtr, argvPtr); free(argv); - + free(buf0); return 0; } -- 2.34.1