diff options
author | Timo Sirainen <cras@irssi.org> | 2000-12-02 07:02:59 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2000-12-02 07:02:59 +0000 |
commit | 32790f15151664d7869f4e898c833f1ede81c0f9 (patch) | |
tree | 9f61a55f0d803f3e29f85265327caaac476cd3ed /src/lib-popt/popt.c | |
parent | 0cb6db26d98c76b7965b0b9ddf2ed2e2892257cb (diff) | |
download | irssi-32790f15151664d7869f4e898c833f1ede81c0f9.zip |
don't use alloca()
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@917 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/lib-popt/popt.c')
-rw-r--r-- | src/lib-popt/popt.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/src/lib-popt/popt.c b/src/lib-popt/popt.c index 7b11a3c3..c09a0b30 100644 --- a/src/lib-popt/popt.c +++ b/src/lib-popt/popt.c @@ -4,10 +4,6 @@ #include "common.h" -#if HAVE_ALLOCA_H -# include <alloca.h> -#endif - #include "findme.h" #include "popt.h" #include "poptint.h" @@ -181,8 +177,7 @@ static void execCommand(poptContext con) { if (!con->execAbsolute && strchr(script, '/')) return; if (!strchr(script, '/') && con->execPath) { - argv[pos] = alloca(strlen(con->execPath) + strlen(script) + 2); - sprintf(argv[pos], "%s/%s", con->execPath, script); + argv[pos] = g_strdup_printf("%s/%s", con->execPath, script); } else { argv[pos] = script; } @@ -274,7 +269,7 @@ static const struct poptOption * findOption(const struct poptOption * table, int poptGetNextOpt(poptContext con) { char * optString, * chptr, * localOptString; char * longArg = NULL; - char * origOptString; + char * origOptString, *dup; long aLong; char * end; const struct poptOption * opt = NULL; @@ -284,7 +279,12 @@ int poptGetNextOpt(poptContext con) { void * cbData; int singleDash; + dup = NULL; while (!done) { + if (dup) { + g_free(dup); + dup = NULL; + } while (!con->os->nextCharArg && con->os->next == con->os->argc && con->os > con->optionStack) con->os--; @@ -306,12 +306,13 @@ int poptGetNextOpt(poptContext con) { } /* Make a copy we can hack at */ - localOptString = optString = - strcpy(alloca(strlen(origOptString) + 1), - origOptString); + dup = localOptString = optString = + g_strdup(origOptString); - if (!optString[0]) + if (!optString[0]) { + g_free(dup); return POPT_ERROR_BADOPT; + } if (optString[1] == '-' && !optString[2]) { con->restLeftover = 1; @@ -337,7 +338,10 @@ int poptGetNextOpt(poptContext con) { opt = findOption(con->options, optString, '\0', &cb, &cbData, singleDash); - if (!opt && !singleDash) return POPT_ERROR_BADOPT; + if (!opt && !singleDash) { + g_free(dup); + return POPT_ERROR_BADOPT; + } } if (!opt) @@ -359,8 +363,10 @@ int poptGetNextOpt(poptContext con) { opt = findOption(con->options, NULL, *origOptString, &cb, &cbData, 0); - if (!opt) return POPT_ERROR_BADOPT; - + if (!opt) { + g_free(dup); + return POPT_ERROR_BADOPT; + } origOptString++; if (*origOptString) con->os->nextCharArg = origOptString; @@ -380,8 +386,10 @@ int poptGetNextOpt(poptContext con) { while (con->os->next == con->os->argc && con->os > con->optionStack) con->os--; - if (con->os->next == con->os->argc) + if (con->os->next == con->os->argc) { + g_free(dup); return POPT_ERROR_NOARG; + } con->os->nextArg = con->os->argv[con->os->next++]; } @@ -395,16 +403,22 @@ int poptGetNextOpt(poptContext con) { case POPT_ARG_INT: case POPT_ARG_LONG: aLong = strtol(con->os->nextArg, &end, 0); - if (!(end && *end == '\0')) + if (!(end && *end == '\0')) { + g_free(dup); return POPT_ERROR_BADNUMBER; + } - if (aLong == LONG_MIN || aLong == LONG_MAX) + if (aLong == LONG_MIN || aLong == LONG_MAX) { + g_free(dup); return POPT_ERROR_OVERFLOW; + } if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) { *((long *) opt->arg) = aLong; } else { - if (aLong > INT_MAX || aLong < INT_MIN) + if (aLong > INT_MAX || aLong < INT_MIN) { + g_free(dup); return POPT_ERROR_OVERFLOW; + } *((int *) opt->arg) =aLong; } break; @@ -441,6 +455,7 @@ int poptGetNextOpt(poptContext con) { con->finalArgv[con->finalArgvCount++] = g_strdup(con->os->nextArg); } + if (dup) g_free(dup); return opt->val; } |