summaryrefslogtreecommitdiff
path: root/popt
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2001-03-23 03:44:50 +0000
committerAndrew Tridgell <tridge@samba.org>2001-03-23 03:44:50 +0000
commit6afe7f23b0440d3261fb99e3f7b4d56bd00713cc (patch)
tree49f178b9e11c01ca6cb2655fbc9da94e2ea3d825 /popt
parent19b27a485e833e08160ef0bae8f604c6f60e5ef8 (diff)
downloadrsync-6afe7f23b0440d3261fb99e3f7b4d56bd00713cc.tar.gz
rsync-6afe7f23b0440d3261fb99e3f7b4d56bd00713cc.tar.bz2
rsync-6afe7f23b0440d3261fb99e3f7b4d56bd00713cc.zip
got rid of dependency on alloca in popt
Diffstat (limited to 'popt')
-rw-r--r--popt/findme.c11
-rw-r--r--popt/popt.c12
-rw-r--r--popt/poptconfig.c15
-rw-r--r--popt/poptparse.c7
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;
}