Fix: memory management in create.c
[lttng-tools.git] / src / bin / lttng / commands / create.c
index 60f3d7c685b29e266bb94ae3c784fa338686a28f..c8027133d2a0666cf9b2f79dc3c556a046293fc1 100644 (file)
@@ -59,13 +59,13 @@ enum {
        OPT_LIVE_TIMER,
 };
 
-enum {
+enum output_type {
        OUTPUT_UNKNOWN = -1,
        OUTPUT_NONE,
        OUTPUT_LOCAL,
        OUTPUT_NET,
 };
-enum {
+enum session_type {
        SESSION_UNKNOWN = -1,
        SESSION_NORMAL,
        SESSION_LIVE,
@@ -228,7 +228,7 @@ error_create:
  * CMD_ERROR on error
  * CMD_SUCCESS on success
  */
-static int validate_command_options(int session_type)
+static int validate_command_options(enum session_type type)
 {
        int ret = CMD_SUCCESS;
 
@@ -248,8 +248,8 @@ static int validate_command_options(int session_type)
                /* Restriction on flags exist when using template */
                /* Session type flags are not permitted */
                /* --live & --snapshot */
-               if ((opt_live_timer && session_type != SESSION_LIVE) ||
-                               (opt_snapshot && session_type != SESSION_SNAPSHOT)) {
+               if ((opt_live_timer && type != SESSION_LIVE) ||
+                               (opt_snapshot && type != SESSION_SNAPSHOT)) {
                        ERR("It is not possible to change the session type of a template");
                        ret = CMD_ERROR;
                        goto error;
@@ -267,9 +267,9 @@ error:
  * value on command errors.
  */
 static int create_session_basic (const char *session_name,
-               int session_type,
+               enum session_type session_type,
                int live_timer,
-               int output_type,
+               enum output_type output_type,
                const char* url,
                const char* ctrl_url,
                const char* data_url,
@@ -385,9 +385,9 @@ error:
 }
 
 static int generate_output(const char *session_name,
-               int session_type,
+               enum session_type session_type,
                int live_timer,
-               int output_type,
+               enum output_type output_type,
                const char* url,
                const char* ctrl_url,
                const char* data_url,
@@ -450,15 +450,16 @@ error:
 
 static int parse_template (struct config_document *template,
                char **session_name,
-               int *session_type,
+               enum session_type *session_type,
                int *live_timer,
-               int *output_type,
+               enum output_type *output_type,
                char **url,
                char **ctrl_url,
                char **data_url,
                char **shm_path)
 {
        int ret = 0;
+       int printed_byte;
        char *raw_value = NULL;
 
        assert(template);
@@ -495,8 +496,8 @@ static int parse_template (struct config_document *template,
 
                        if (strlen(raw_value) > 0) {
                                *output_type = OUTPUT_LOCAL;
-                               ret = asprintf(url, "file://%s", raw_value);
-                               if (ret < 0) {
+                               printed_byte = asprintf(url, "file://%s", raw_value);
+                               if (printed_byte < 0) {
                                        ret = -1;
                                        goto error;
                                }
@@ -532,8 +533,8 @@ static int parse_template (struct config_document *template,
 
                        if (strlen(raw_value) > 0) {
                                *output_type = OUTPUT_LOCAL;
-                               ret = asprintf(url, "file://%s", raw_value);
-                               if (ret < 0) {
+                               printed_byte = asprintf(url, "file://%s", raw_value);
+                               if (printed_byte < 0) {
                                        ret = -1;
                                        goto error;
                                }
@@ -556,6 +557,9 @@ static int parse_template (struct config_document *template,
                        /* There is no output definition */
                }
                break;
+       case SESSION_UNKNOWN:
+               ret = -1;
+               goto error;
        }
 
 
@@ -569,9 +573,9 @@ error:
 }
 static int create_session_from_template(struct config_document *template,
                const char *session_name,
-               int session_type,
+               enum session_type session_type,
                int live_timer,
-               int output_type,
+               enum output_type output_type,
                const char *url,
                const char *ctrl_url,
                const char *data_url,
@@ -579,6 +583,7 @@ static int create_session_from_template(struct config_document *template,
                const char *datetime)
 {
        int ret = CMD_SUCCESS;
+       int printed_byte;
        struct config_element *temp_element = NULL;
        struct config_element *temp_element_child = NULL;
        char tmp_ctrl_uri[PATH_MAX];
@@ -619,8 +624,21 @@ static int create_session_from_template(struct config_document *template,
         */
        if (session_type == SESSION_LIVE) {
                if (config_document_element_exist(template, "/sessions/session/attributes/live_timer_interval")) {
-                       asprintf(&tmp_string, "%d", live_timer);
-                       config_document_replace_element_value(template, "/sessions/session/attributes/live_timer_interval", tmp_string);
+                       printed_byte = asprintf(&tmp_string, "%d", live_timer);
+                       if (printed_byte < 0) {
+                               ERR("Asprintf failed for live timer");
+                               ret = CMD_ERROR;
+                               goto error;
+                       }
+                       ret = config_document_replace_element_value(template, "/sessions/session/attributes/live_timer_interval", tmp_string);
+
+                       if (ret) {
+                               printf("error: %d\n", ret);
+                               ERR("Replacement of live_timer_interval failed");
+                               ret = CMD_ERROR;
+                               goto error;
+                       }
+
                        free(tmp_string);
                        tmp_string = NULL;
                } else {
@@ -704,7 +722,9 @@ static int create_session_from_template(struct config_document *template,
                        ret = CMD_ERROR;
                        goto error;
                }
+
                config_element_free(temp_element);
+               temp_element = NULL;
 
                temp_element = config_element_create("data_uri", tmp_data_uri);
 
@@ -721,6 +741,7 @@ static int create_session_from_template(struct config_document *template,
                        goto error;
                }
                config_element_free(temp_element);
+               temp_element = NULL;
                break;
        default:
                ret = CMD_ERROR;
@@ -741,6 +762,10 @@ static int create_session_from_template(struct config_document *template,
                goto error;
        }
 
+       config_element_free(temp_element_child);
+       temp_element_child = NULL;
+
+
        /*
         * validate and replace the destination node for each session type
         * TODO: export string as const and simply assign a base path for the
@@ -772,6 +797,8 @@ static int create_session_from_template(struct config_document *template,
                goto error;
        }
 
+       config_element_free(temp_element);
+       temp_element = NULL;
 
        if (ret) {
                ERR("%s", lttng_strerror(ret));
@@ -798,6 +825,9 @@ static int create_session_from_template(struct config_document *template,
                        ret = CMD_ERROR;
                        goto error;
                }
+
+               config_element_free(temp_element);
+               temp_element = NULL;
        }
 
        ret = config_load_configuration_sessions(template, session_name, 0);
@@ -821,14 +851,15 @@ error:
 static int create_session(void)
 {
        int ret;
+       int printed_byte;
 
 
        /* Template */
        struct config_document *template = NULL;
 
        /* Base data */
-       int base_session_type = SESSION_UNKNOWN;
-       int base_output_type = OUTPUT_UNKNOWN;
+       enum session_type base_session_type = SESSION_UNKNOWN;
+       enum output_type base_output_type = OUTPUT_UNKNOWN;
        char *base_session_name = NULL;
        char *base_url = NULL;
        char *base_ctrl_url = NULL;
@@ -934,23 +965,26 @@ static int create_session(void)
                        goto error;
                }
 
-               ret = asprintf(&session_name_date, "%s-%s", base_session_name, datetime);
-               if (ret < 0) {
+               printed_byte = asprintf(&session_name_date, "%s-%s", base_session_name, datetime);
+               if (printed_byte < 0) {
                        PERROR("Asprintf session name");
+                       ret = CMD_ERROR;
                        goto error;
                }
                DBG("Session name from command option set to %s", base_session_name);
        } else if (base_session_name) {
-               ret = asprintf(&session_name_date, "%s-%s", base_session_name, datetime);
-               if (ret < 0) {
+               printed_byte = asprintf(&session_name_date, "%s-%s", base_session_name, datetime);
+               if (printed_byte < 0) {
                        PERROR("Asprintf session name");
+                       ret = CMD_ERROR;
                        goto error;
                }
        } else {
                /* Generate a name */
-               ret = asprintf(&base_session_name, DEFAULT_SESSION_NAME "-%s", datetime);
-               if (ret < 0) {
+               printed_byte = asprintf(&base_session_name, DEFAULT_SESSION_NAME "-%s", datetime);
+               if (printed_byte < 0) {
                        PERROR("Asprintf session name");
+                       ret = CMD_ERROR;
                        goto error;
                }
                session_name_date = strdup(base_session_name);
@@ -984,8 +1018,8 @@ static int create_session(void)
                }
 
                /* Create URL string from the local file system path */
-               ret = asprintf(&temp_url, "file://%s", traces_path);
-               if (ret < 0) {
+               printed_byte = asprintf(&temp_url, "file://%s", traces_path);
+               if (printed_byte < 0) {
                        PERROR("asprintf url path");
                        ret = CMD_FATAL;
                        goto error;
@@ -1017,11 +1051,11 @@ static int create_session(void)
                                goto error;
                        }
 
-                       ret = asprintf(&tmp_url,
+                       printed_byte = asprintf(&tmp_url,
                                        "file://%s/" DEFAULT_TRACE_DIR_NAME "/%s",
                                        tmp_home_path, session_name_date);
 
-                       if (ret < 0) {
+                       if (printed_byte < 0) {
                                PERROR("asprintf trace dir name");
                                ret = CMD_FATAL;
                                goto error;
@@ -1031,8 +1065,8 @@ static int create_session(void)
                        break;
                case SESSION_LIVE:
                        /* Default to a net output */
-                       ret = asprintf(&tmp_url, "net://127.0.0.1");
-                       if (ret < 0) {
+                       printed_byte = asprintf(&tmp_url, "net://127.0.0.1");
+                       if (printed_byte < 0) {
                                PERROR("asprintf default live URL");
                                ret = CMD_FATAL;
                                goto error;
@@ -1050,9 +1084,12 @@ static int create_session(void)
          * Shared memory path handling
          */
        if (opt_shm_path) {
-               ret = asprintf(&base_shm_path, "%s/%s", opt_shm_path, session_name_date);
-               if (ret < 0) {
+               /* Overwrite shm_path so clear any previously defined one */
+               free(base_shm_path);
+               printed_byte = asprintf(&base_shm_path, "%s/%s", opt_shm_path, session_name_date);
+               if (printed_byte < 0) {
                        PERROR("asprintf shm_path");
+                       ret = CMD_FATAL;
                        goto error;
                }
        }
@@ -1147,8 +1184,10 @@ static int create_session(void)
 
 error:
        /* Session temp stuff */
+       config_document_free(template);
        free(session_name_date);
        free(uris);
+       free(traces_path);
 
        if (ret < 0) {
                ERR("%s", lttng_strerror(ret));
This page took 0.029309 seconds and 5 git commands to generate.