Fix: lttng-clear: invalid free of session name
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 20 Dec 2019 06:39:17 +0000 (01:39 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 20 Dec 2019 07:16:26 +0000 (02:16 -0500)
Valgrind reports an invalid free of session_name when it is sourced
from the popt args. Only free it when it comes from the .lttngrc file.

This also caused spurious core dumps when running the tests on
one of my machines.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I194cd36147a1028aad503b4e5d3ea23732a30bc5

src/bin/lttng/commands/clear.c

index 353c855c6f11aed6036f6a8f855035d31d7f8b54..24db9f37e89fb819e37e10dc4bdd349056c001b0 100644 (file)
@@ -168,7 +168,7 @@ int cmd_clear(int argc, const char **argv)
        static poptContext pc;
        char *session_name = NULL;
        const char *leftover = NULL;
-
+       bool free_session_name = false;
        struct lttng_session *sessions = NULL;
        int count;
        int found;
@@ -224,13 +224,7 @@ int cmd_clear(int argc, const char **argv)
        }
 
        if (!opt_clear_all) {
-               /*
-                * popt expects us to free this even if it returns a const char *.
-                * See https://www.mail-archive.com/popt-devel@rpm5.org/msg00193.html
-                * Force cast to char * allowing later freeing if necessary.
-                */
                session_name = (char *) poptGetArg(pc);
-
                if (!session_name) {
                        /* No session name specified, lookup default */
                        session_name = get_session_name();
@@ -239,6 +233,7 @@ int cmd_clear(int argc, const char **argv)
                                success = 0;
                                goto mi_closing;
                        }
+                       free_session_name = true;
                }
        } else {
                session_name = NULL;
@@ -323,7 +318,9 @@ end:
        }
 
        free(sessions);
-       free(session_name);
+       if (free_session_name) {
+               free(session_name);
+       }
 
        /* Overwrite ret if an error occurred during clear_session/all */
        ret = command_ret ? command_ret : ret;
This page took 0.025659 seconds and 4 git commands to generate.