From fd076c09672458b1bc5a8ea46f8fe060f5f8ab43 Mon Sep 17 00:00:00 2001 From: Christian Babeux Date: Wed, 15 Aug 2012 12:39:30 -0400 Subject: [PATCH] Fix: Invalid free on session_name when destroying session The session_name should not be free(3) if the user has specified a session name on the command line. Also, the caller is responsible to free the allocated string when calling get_session_name(). Handle both cases gracefully. Acked-by: Mathieu Desnoyers Signed-off-by: Christian Babeux Signed-off-by: David Goulet --- src/bin/lttng/commands/destroy.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c index 5b69cb5d9..7b7ea0e80 100644 --- a/src/bin/lttng/commands/destroy.c +++ b/src/bin/lttng/commands/destroy.c @@ -28,6 +28,7 @@ #include +static char *opt_session_name; static int opt_destroy_all; enum { @@ -156,28 +157,32 @@ int cmd_destroy(int argc, const char **argv) goto end; } - session_name = (char *) poptGetArg(pc); - - /* - * ignore session name in case all - * sessions are to be destroyed - */ + /* Ignore session name in case all sessions are to be destroyed */ if (opt_destroy_all) { ret = destroy_all_sessions(); goto end; } - if (session_name == NULL) { - ret = get_default_session_name(&session_name); - if (ret < 0 || session_name == NULL) { + + opt_session_name = (char *) poptGetArg(pc); + + if (opt_session_name == NULL) { + /* No session name specified, lookup default */ + session_name = get_session_name(); + if (session_name == NULL) { + ret = CMD_ERROR; goto end; } + } else { + session_name = opt_session_name; } + ret = destroy_session(session_name); end: - poptFreeContext(pc); - if (session_name != NULL) { + if (opt_session_name == NULL) { free(session_name); } + + poptFreeContext(pc); return ret; } -- 2.34.1