Fix memory leaks induced by lack of libpopt documentation
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 16 Oct 2012 22:58:11 +0000 (18:58 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 16 Oct 2012 22:58:11 +0000 (18:58 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
converter/babeltrace.c

index f590abdf7c4b0802db2767ff9cce64b45d19ab00..113655836a4777ba7b8b77043d976e3cb0252c4b 100644 (file)
 #define PARTIAL_ERROR_SLEEP    3       /* 3 seconds */
 
 #define DEFAULT_FILE_ARRAY_SIZE        1
 #define PARTIAL_ERROR_SLEEP    3       /* 3 seconds */
 
 #define DEFAULT_FILE_ARRAY_SIZE        1
+
+/*
+ * casting these to const char * to please libpopt. It allocates memory
+ * behind our back (this is of course not documented).
+ */
 static char *opt_input_format, *opt_output_format;
 static char *opt_input_format, *opt_output_format;
-/* Pointer into const argv */
-static const char *opt_input_format_arg, *opt_output_format_arg;
 
 static GPtrArray *opt_input_paths;
 
 static GPtrArray *opt_input_paths;
-static const char *opt_output_path;
+static char *opt_output_path;
 
 static struct format *fmt_read;
 
 
 static struct format *fmt_read;
 
@@ -67,6 +70,9 @@ void strlower(char *str)
 
 enum {
        OPT_NONE = 0,
 
 enum {
        OPT_NONE = 0,
+       OPT_OUTPUT_PATH,
+       OPT_INPUT_FORMAT,
+       OPT_OUTPUT_FORMAT,
        OPT_HELP,
        OPT_LIST,
        OPT_VERBOSE,
        OPT_HELP,
        OPT_LIST,
        OPT_VERBOSE,
@@ -82,11 +88,16 @@ enum {
        OPT_CLOCK_FORCE_CORRELATE,
 };
 
        OPT_CLOCK_FORCE_CORRELATE,
 };
 
+/*
+ * We are _not_ using POPT_ARG_STRING ability to store directly into
+ * variables, because we want to cast the return to non-const, which is
+ * not possible without using poptGetOptArg explicitly.
+ */
 static struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
 static struct poptOption long_options[] = {
        /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
-       { "output", 'w', POPT_ARG_STRING, &opt_output_path, OPT_NONE, NULL, NULL },
-       { "input-format", 'i', POPT_ARG_STRING, &opt_input_format_arg, OPT_NONE, NULL, NULL },
-       { "output-format", 'o', POPT_ARG_STRING, &opt_output_format_arg, OPT_NONE, NULL, NULL },
+       { "output", 'w', POPT_ARG_STRING, NULL, OPT_NONE, NULL, NULL },
+       { "input-format", 'i', POPT_ARG_STRING, NULL, OPT_INPUT_FORMAT, NULL, NULL },
+       { "output-format", 'o', POPT_ARG_STRING, NULL, OPT_OUTPUT_FORMAT, NULL, NULL },
        { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
        { "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL },
        { "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
        { "help", 'h', POPT_ARG_NONE, NULL, OPT_HELP, NULL, NULL },
        { "list", 'l', POPT_ARG_NONE, NULL, OPT_LIST, NULL, NULL },
        { "verbose", 'v', POPT_ARG_NONE, NULL, OPT_VERBOSE, NULL, NULL },
@@ -238,7 +249,7 @@ static int parse_options(int argc, char **argv)
 {
        poptContext pc;
        int opt, ret = 0;
 {
        poptContext pc;
        int opt, ret = 0;
-       const char *ipath;
+       char *ipath;
 
        if (argc == 1) {
                usage(stdout);
 
        if (argc == 1) {
                usage(stdout);
@@ -254,6 +265,27 @@ static int parse_options(int argc, char **argv)
 
        while ((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
 
        while ((opt = poptGetNextOpt(pc)) != -1) {
                switch (opt) {
+               case OPT_OUTPUT_PATH:
+                       opt_output_path = (char *) poptGetOptArg(pc);
+                       if (!opt_output_path) {
+                               ret = -EINVAL;
+                               goto end;
+                       }
+                       break;
+               case OPT_INPUT_FORMAT:
+                       opt_input_format = (char *) poptGetOptArg(pc);
+                       if (!opt_input_format) {
+                               ret = -EINVAL;
+                               goto end;
+                       }
+                       break;
+               case OPT_OUTPUT_FORMAT:
+                       opt_output_format = (char *) poptGetOptArg(pc);
+                       if (!opt_output_format) {
+                               ret = -EINVAL;
+                               goto end;
+                       }
+                       break;
                case OPT_HELP:
                        usage(stdout);
                        ret = 1;        /* exit cleanly */
                case OPT_HELP:
                        usage(stdout);
                        ret = 1;        /* exit cleanly */
@@ -328,7 +360,7 @@ static int parse_options(int argc, char **argv)
        }
 
        do {
        }
 
        do {
-               ipath = poptGetArg(pc);
+               ipath = (char *) poptGetArg(pc);
                if (ipath)
                        g_ptr_array_add(opt_input_paths, (gpointer) ipath);
        } while (ipath);
                if (ipath)
                        g_ptr_array_add(opt_input_paths, (gpointer) ipath);
        } while (ipath);
@@ -526,22 +558,10 @@ int main(int argc, char **argv)
        printf_verbose("Verbose mode active.\n");
        printf_debug("Debug mode active.\n");
 
        printf_verbose("Verbose mode active.\n");
        printf_debug("Debug mode active.\n");
 
-       if (opt_input_format_arg) {
-               opt_input_format = strdup(opt_input_format_arg);
-               if (!opt_input_format) {
-                       partial_error = 1;
-                       goto end;
-               }
+       if (opt_input_format)
                strlower(opt_input_format);
                strlower(opt_input_format);
-       }
-       if (opt_output_format_arg) {
-               opt_output_format = strdup(opt_output_format_arg);
-               if (!opt_output_format) {
-                       partial_error = 1;
-                       goto end;
-               }
+       if (opt_output_format)
                strlower(opt_output_format);
                strlower(opt_output_format);
-       }
 
        printf_verbose("Converting from directory(ies):\n");
        for (i = 0; i < opt_input_paths->len; i++) {
 
        printf_verbose("Converting from directory(ies):\n");
        for (i = 0; i < opt_input_paths->len; i++) {
@@ -649,6 +669,11 @@ error_td_read:
 end:
        free(opt_input_format);
        free(opt_output_format);
 end:
        free(opt_input_format);
        free(opt_output_format);
+       free(opt_output_path);
+       for (i = 0; i < opt_input_paths->len; i++) {
+               char *ipath = g_ptr_array_index(opt_input_paths, i);
+               free(ipath);
+       }
        g_ptr_array_free(opt_input_paths, TRUE);
        if (partial_error)
                exit(EXIT_FAILURE);
        g_ptr_array_free(opt_input_paths, TRUE);
        if (partial_error)
                exit(EXIT_FAILURE);
This page took 0.026258 seconds and 4 git commands to generate.