@@ -638,10 +638,11 @@ /* Allocate "argc + 1" (+1 for the NULL terminator) elements. */ newargv = malloc((argc + 1) * sizeof(*newargv)); if (newargv == NULL) { lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = NULL; lc_errno = LC_ERR_ENOMEM; return(-1); } newargv[newargvidx++] = argv[0]; newargv[argc] = NULL; @@ -649,10 +650,11 @@ /* Allocate space to indicate which arguments have been used. */ usedargv = malloc(argc * sizeof(*usedargv)); if (usedargv == NULL) { lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = NULL; lc_errno = LC_ERR_ENOMEM; free(newargv); return(-1); } for (cmdargidx = 0; cmdargidx < argc; cmdargidx++) { @@ -733,12 +735,12 @@ cmdargidx++; if (cmdargidx >= argc) { fprintf(stderr, "Argument required.\n"); lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; - lc_errno = LC_ERR_BADFORMAT; lc_erroptname = strdup(cmdarg); + lc_errno = LC_ERR_BADFORMAT; free(usedargv); free(newargv); return(-1); } cmdoptarg = argv[cmdargidx]; @@ -759,10 +761,11 @@ if (handler == NULL) { fprintf(stderr, "Unknown option: --%s\n", cmdarg); lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = strdup(cmdarg); lc_errno = LC_ERR_INVCMD; free(usedargv); free(newargv); return(-1); } @@ -789,10 +792,11 @@ cmdargidx++; if (cmdargidx >= argc) { fprintf(stderr, "Argument required.\n"); lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = strdup(cmdarg); lc_errno = LC_ERR_BADFORMAT; free(usedargv); free(newargv); return(-1); } @@ -803,10 +807,11 @@ chkretval = lc_handle(handler, handler->var, NULL, cmdoptarg, LC_FLAGS_CMDLINE); if (chkretval < 0) { lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = strdup(cmdarg); retval = -1; } break; } @@ -813,10 +818,13 @@ if (handler == NULL) { fprintf(stderr, "Unknown option: -%c\n", ch); lc_errfile = local_lc_errfile; lc_errline = local_lc_errline; + lc_erroptname = malloc(2); + lc_erroptname[0] = ch; + lc_erroptname[1] = '\0'; lc_errno = LC_ERR_INVCMD; free(usedargv); free(newargv); return(-1); } @@ -886,10 +894,11 @@ handler->type != LC_VAR_BOOL_BY_EXISTANCE && handler->type != LC_VAR_SECTION && handler->type != LC_VAR_SECTIONSTART && handler->type != LC_VAR_SECTIONEND) { lc_errno = LC_ERR_BADFORMAT; + lc_erroptname = NULL; break; } return(lc_handle(handler, var, varargs, value, flags)); } @@ -972,10 +981,11 @@ chkretval = lc_process_conf_xml(appname, pathname); break; default: chkretval = -1; lc_errno = LC_ERR_INVDATA; + lc_erroptname = NULL; break; } return(chkretval); } @@ -1065,10 +1075,15 @@ if (lc_err_usererrmsg) { free((char *) lc_err_usererrmsg); lc_err_usererrmsg = NULL; } + + if (lc_erroptname) { + free(lc_erroptname); + lc_erroptname = NULL; + } varhandlers = NULL; return; }