Fix: Unbalanced rcu_read_unlock() on stream file creation failure
[lttng-tools.git] / src / lib / lttng-ctl / lttng-ctl.c
index d2f6799e11a070031805f09774e33b137c33d38c..ae9cede2588d0ba97218d43dc55b55e5fdeab139 100644 (file)
@@ -222,7 +222,7 @@ int lttng_check_tracing_group(void)
        }
 
        /* Alloc group list of the right size */
-       grp_list = malloc(grp_list_size * sizeof(gid_t));
+       grp_list = zmalloc(grp_list_size * sizeof(gid_t));
        if (!grp_list) {
                perror("malloc");
                goto end;
@@ -442,7 +442,11 @@ int lttng_ctl_ask_sessiond_varlen(struct lttcomm_session_msg *lsm,
                goto end;
        }
 
-       data = (void*) malloc(size);
+       data = zmalloc(size);
+       if (!data) {
+               ret = -ENOMEM;
+               goto end;
+       }
 
        /* Get payload data */
        ret = recv_data_sessiond(data, size);
@@ -482,7 +486,7 @@ struct lttng_handle *lttng_create_handle(const char *session_name,
                goto end;
        }
 
-       handle = malloc(sizeof(struct lttng_handle));
+       handle = zmalloc(sizeof(struct lttng_handle));
        if (handle == NULL) {
                PERROR("malloc handle");
                goto end;
@@ -703,14 +707,14 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev)
        /* Don't add filter for the '*' event. */
        if (ev->name[0] != '*') {
                if (filter) {
-                       err = asprintf(&jul_filter, "%s && logger_name == \"%s\"", filter,
+                       err = asprintf(&jul_filter, "(%s) && (logger_name == \"%s\")", filter,
                                        ev->name);
                } else {
                        err = asprintf(&jul_filter, "logger_name == \"%s\"", ev->name);
                }
                if (err < 0) {
                        PERROR("asprintf");
-                       goto end;
+                       goto error;
                }
        }
 
@@ -724,23 +728,30 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev)
                        op = "==";
                }
 
-               if (filter) {
-                       err = asprintf(&jul_filter, "%s && int_loglevel %s %d", filter, op,
+               if (filter || jul_filter) {
+                       char *new_filter;
+
+                       err = asprintf(&new_filter, "(%s) && (int_loglevel %s %d)",
+                                       jul_filter ? jul_filter : filter, op,
                                        ev->loglevel);
+                       if (jul_filter) {
+                               free(jul_filter);
+                       }
+                       jul_filter = new_filter;
                } else {
                        err = asprintf(&jul_filter, "int_loglevel %s %d", op,
                                        ev->loglevel);
                }
                if (err < 0) {
                        PERROR("asprintf");
-                       free(jul_filter);
-                       jul_filter = NULL;
-                       goto end;
+                       goto error;
                }
        }
 
-end:
        return jul_filter;
+error:
+       free(jul_filter);
+       return NULL;
 }
 
 /*
@@ -844,7 +855,6 @@ static int generate_filter(char *filter_expression,
        return 0;
 
 parse_error:
-       filter_bytecode_free(ctx);
        filter_ir_free(ctx);
        filter_parser_ctx_free(ctx);
 filter_alloc_error:
@@ -967,7 +977,7 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
                        + LTTNG_SYMBOL_NAME_LEN * exclusion_count);
        if (!varlen_data) {
                ret = -LTTNG_ERR_EXCLUSION_NOMEM;
-               goto filter_error;
+               goto mem_error;
        }
 
        /* Put exclusion names first in the data */
@@ -996,19 +1006,19 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
                        lsm.u.enable.bytecode_len + lsm.u.enable.expression_len, NULL);
        free(varlen_data);
 
-filter_error:
-       if (filter_expression) {
+mem_error:
+       if (filter_expression && ctx) {
                filter_bytecode_free(ctx);
                filter_ir_free(ctx);
                filter_parser_ctx_free(ctx);
-               if (free_filter_expression) {
-                       /*
-                        * The filter expression has been replaced and must be
-                        * freed as it is not the original filter expression
-                        * received as a parameter.
-                        */
-                       free(filter_expression);
-               }
+       }
+filter_error:
+       if (free_filter_expression) {
+               /*
+                * The filter expression has been replaced and must be freed as it is
+                * not the original filter expression received as a parameter.
+                */
+               free(filter_expression);
        }
 error:
        /*
@@ -1050,7 +1060,7 @@ int lttng_disable_event(struct lttng_handle *handle, const char *name,
 
        lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
 
-       if (name != NULL) {
+       if (name != NULL && *name != '*') {
                lttng_ctl_copy_string(lsm.u.disable.name, name,
                                sizeof(lsm.u.disable.name));
                lsm.cmd_type = LTTNG_DISABLE_EVENT;
This page took 0.035084 seconds and 4 git commands to generate.