third_party: Update popt to 1.16 release
[samba.git] / third_party / popt / poptparse.c
index b03deef0850588251e71434d4cc7418d7bc25a3c..39bf1aad195615b2febb206369216710979b1e54 100644 (file)
@@ -10,7 +10,6 @@
 
 #define POPT_ARGV_ARRAY_GROW_DELTA 5
 
-/*@-boundswrite@*/
 int poptDupArgv(int argc, const char **argv,
                int * argcPtr, const char *** argvPtr)
 {
@@ -27,18 +26,18 @@ int poptDupArgv(int argc, const char **argv,
        nb += strlen(argv[i]) + 1;
     }
        
-    dst = (char *)malloc(nb);
+    dst = malloc(nb);
     if (dst == NULL)                   /* XXX can't happen */
        return POPT_ERROR_MALLOC;
-    argv2 = (const char **) dst;
+    argv2 = (void *) dst;
     dst += (argc + 1) * sizeof(*argv);
+    *dst = '\0';
 
-    /*@-branchstate@*/
     for (i = 0; i < argc; i++) {
        argv2[i] = dst;
-       dst += strlen(strcpy(dst, argv[i])) + 1;
+       dst = stpcpy(dst, argv[i]);
+       dst++;  /* trailing NUL */
     }
-    /*@=branchstate@*/
     argv2[argc] = NULL;
 
     if (argvPtr) {
@@ -51,21 +50,24 @@ int poptDupArgv(int argc, const char **argv,
        *argcPtr = argc;
     return 0;
 }
-/*@=boundswrite@*/
 
-/*@-bounds@*/
 int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
 {
     const char * src;
     char quote = '\0';
     int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
-    const char ** argv = (const char **)malloc(sizeof(*argv) * argvAlloced);
+    const char ** argv = malloc(sizeof(*argv) * argvAlloced);
     int argc = 0;
-    int buflen = strlen(s) + 1;
-    char * buf = (char*)memset(alloca(buflen), 0, buflen);
+    size_t buflen = strlen(s) + 1;
+    char * buf, * bufOrig = NULL;
     int rc = POPT_ERROR_MALLOC;
 
     if (argv == NULL) return rc;
+    buf = bufOrig = calloc((size_t)1, buflen);
+    if (buf == NULL) {
+       free(argv);
+       return rc;
+    }
     argv[argc] = buf;
 
     for (src = s; *src != '\0'; src++) {
@@ -81,12 +83,12 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
                if (*src != quote) *buf++ = '\\';
            }
            *buf++ = *src;
-       } else if (isspace(*src)) {
+       } else if (_isspaceptr(src)) {
            if (*argv[argc] != '\0') {
                buf++, argc++;
                if (argc == argvAlloced) {
                    argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
-                   argv = (const char **)realloc(argv, sizeof(*argv) * argvAlloced);
+                   argv = realloc(argv, sizeof(*argv) * argvAlloced);
                    if (argv == NULL) goto exit;
                }
                argv[argc] = buf;
@@ -116,29 +118,29 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
     rc = poptDupArgv(argc, argv, argcPtr, argvPtr);
 
 exit:
+    if (bufOrig) free(bufOrig);
     if (argv) free(argv);
     return rc;
 }
-/*@=bounds@*/
 
 /* still in the dev stage.
  * return values, perhaps 1== file erro
  * 2== line to long
  * 3== umm.... more?
  */
-int poptConfigFileToString(FILE *fp, char ** argstrp, /*@unused@*/ int flags)
+int poptConfigFileToString(FILE *fp, char ** argstrp,
+               /*@unused@*/ UNUSED(int flags))
 {
     char line[999];
     char * argstr;
     char * p;
     char * q;
     char * x;
-    int t;
-    int argvlen = 0;
+    size_t t;
+    size_t argvlen = 0;
     size_t maxlinelen = sizeof(line);
     size_t linelen;
-    int maxargvlen = 480;
-    int linenum = 0;
+    size_t maxargvlen = (size_t)480;
 
     *argstrp = NULL;
 
@@ -149,41 +151,42 @@ int poptConfigFileToString(FILE *fp, char ** argstrp, /*@unused@*/ int flags)
     if (fp == NULL)
        return POPT_ERROR_NULLARG;
 
-    argstr = (char *)calloc(maxargvlen, sizeof(*argstr));
+    argstr = calloc(maxargvlen, sizeof(*argstr));
     if (argstr == NULL) return POPT_ERROR_MALLOC;
 
     while (fgets(line, (int)maxlinelen, fp) != NULL) {
-       linenum++;
        p = line;
 
        /* loop until first non-space char or EOL */
-       while( *p != '\0' && isspace(*p) )
+       while( *p != '\0' && _isspaceptr(p) )
            p++;
 
        linelen = strlen(p);
-       if (linelen >= maxlinelen-1)
+       if (linelen >= maxlinelen-1) {
+           free(argstr);
            return POPT_ERROR_OVERFLOW; /* XXX line too long */
+       }
 
        if (*p == '\0' || *p == '\n') continue; /* line is empty */
        if (*p == '#') continue;                /* comment line */
 
        q = p;
 
-       while (*q != '\0' && (!isspace(*q)) && *q != '=')
+       while (*q != '\0' && (!_isspaceptr(q)) && *q != '=')
            q++;
 
-       if (isspace(*q)) {
+       if (_isspaceptr(q)) {
            /* a space after the name, find next non space */
            *q++='\0';
-           while( *q != '\0' && isspace((int)*q) ) q++;
+           while( *q != '\0' && _isspaceptr(q) ) q++;
        }
        if (*q == '\0') {
            /* single command line option (ie, no name=val, just name) */
            q[-1] = '\0';               /* kill off newline from fgets() call */
-           argvlen += (t = q - p) + (sizeof(" --")-1);
+           argvlen += (t = (size_t)(q - p)) + (sizeof(" --")-1);
            if (argvlen >= maxargvlen) {
                maxargvlen = (t > maxargvlen) ? t*2 : maxargvlen*2;
-               argstr = (char *)realloc(argstr, maxargvlen);
+               argstr = realloc(argstr, maxargvlen);
                if (argstr == NULL) return POPT_ERROR_MALLOC;
            }
            strcat(argstr, " --");
@@ -197,22 +200,22 @@ int poptConfigFileToString(FILE *fp, char ** argstrp, /*@unused@*/ int flags)
        *q++ = '\0';
 
        /* find next non-space letter of value */
-       while (*q != '\0' && isspace(*q))
+       while (*q != '\0' && _isspaceptr(q))
            q++;
        if (*q == '\0')
            continue;   /* XXX silently ignore missing value */
 
        /* now, loop and strip all ending whitespace */
        x = p + linelen;
-       while (isspace(*--x))
-           *x = 0;     /* null out last char if space (including fgets() NL) */
+       while (_isspaceptr(--x))
+           *x = '\0';  /* null out last char if space (including fgets() NL) */
 
        /* rest of line accept */
-       t = x - p;
+       t = (size_t)(x - p);
        argvlen += t + (sizeof("' --='")-1);
        if (argvlen >= maxargvlen) {
            maxargvlen = (t > maxargvlen) ? t*2 : maxargvlen*2;
-           argstr = (char *)realloc(argstr, maxargvlen);
+           argstr = realloc(argstr, maxargvlen);
            if (argstr == NULL) return POPT_ERROR_MALLOC;
        }
        strcat(argstr, " --");