--- a/popt/popt.c +++ b/popt/popt.c @@ -163,8 +163,11 @@ static void invokeCallbacksOPTION(poptContext con, poptContext poptGetContext(const char * name, int argc, const char ** argv, const struct poptOption * options, unsigned int flags) { - poptContext con = malloc(sizeof(*con)); + poptContext con; + if (argc < 1) return NULL; + + con = malloc(sizeof(*con)); if (con == NULL) return NULL; /* XXX can't happen */ memset(con, 0, sizeof(*con)); @@ -189,6 +192,7 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv, con->numExecs = 0; con->finalArgvAlloced = argc * 2; con->finalArgv = calloc( (size_t)con->finalArgvAlloced, sizeof(*con->finalArgv) ); + if (con->finalArgv == NULL) con->finalArgvAlloced = 0; con->execAbsolute = 1; con->arg_strip = NULL; @@ -285,6 +289,7 @@ static int handleExec(/*@special@*/ poptContext con, con->finalArgvAlloced += 10; con->finalArgv = realloc(con->finalArgv, sizeof(*con->finalArgv) * con->finalArgvAlloced); + if (con->finalArgv == NULL) con->finalArgvCount = con->finalArgvAlloced = 0; } i = con->finalArgvCount++; @@ -668,6 +673,7 @@ expandNextArg(/*@special@*/ poptContext con, const char * s) tn += strlen(a); { size_t pos = (size_t) (te - t); t = realloc(t, tn); + if (t == NULL) return NULL; te = stpcpy(t + pos, a); } continue; @@ -1155,6 +1161,7 @@ int poptGetNextOpt(poptContext con) con->finalArgvAlloced += 10; con->finalArgv = realloc(con->finalArgv, sizeof(*con->finalArgv) * con->finalArgvAlloced); + if (con->finalArgv == NULL) con->finalArgvCount = con->finalArgvAlloced = 0; } if (con->finalArgv != NULL)