X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fclient.c;h=2c7bd4787c9371305455dfa7765ab9397d07877f;hp=ae027d5e0d35a1b7bddb4b391d6feeb12aceb27a;hb=2d97a0067600335f07eecb2c1d9ba68fc164583e;hpb=55c9e7cac24318259d4f2549c97f7577b7b52db4 diff --git a/src/bin/lttng-sessiond/client.c b/src/bin/lttng-sessiond/client.c index ae027d5e0..2c7bd4787 100644 --- a/src/bin/lttng-sessiond/client.c +++ b/src/bin/lttng-sessiond/client.c @@ -1207,98 +1207,139 @@ error_add_context: } case LTTNG_TRACK_ID: { - struct lttng_tracker_id id; + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; - memset(&id, 0, sizeof(id)); - id.type = cmd_ctx->lsm->u.id_tracker.id_type; - switch (id.type) { + id = lttng_tracker_id_create(); + if (!id) { + ret = LTTNG_ERR_NOMEM; + goto error; + } + + switch (cmd_ctx->lsm->u.id_tracker.id_type) { case LTTNG_ID_ALL: + status = lttng_tracker_id_set_all(id); break; case LTTNG_ID_VALUE: - id.value = cmd_ctx->lsm->u.id_tracker.u.value; + status = lttng_tracker_id_set_value( + id, cmd_ctx->lsm->u.id_tracker.u.value); break; case LTTNG_ID_STRING: { const size_t var_len = cmd_ctx->lsm->u.id_tracker.u.var_len; + char *string = NULL; - id.string = zmalloc(var_len); - if (!id.string) { + string = zmalloc(var_len); + if (!string) { + lttng_tracker_id_destroy(id); ret = LTTNG_ERR_NOMEM; goto error; } DBG("Receiving var len tracker id string from client"); - ret = lttcomm_recv_unix_sock(*sock, id.string, var_len); + ret = lttcomm_recv_unix_sock(*sock, string, var_len); if (ret <= 0) { DBG("Nothing received"); *sock_error = 1; - free(id.string); + free(string); + lttng_tracker_id_destroy(id); ret = LTTNG_ERR_INVALID; goto error; } - if (strnlen(id.string, var_len) != var_len - 1) { + if (strnlen(string, var_len) != var_len - 1) { DBG("String received as tracker ID is not NULL-terminated"); - free(id.string); + free(string); + lttng_tracker_id_destroy(id); ret = LTTNG_ERR_INVALID; goto error; } + + status = lttng_tracker_id_set_string(id, string); + free(string); break; } default: + lttng_tracker_id_destroy(id); ret = LTTNG_ERR_INVALID; goto error; } + + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid value for tracker id"); + ret = LTTNG_ERR_INVALID; + lttng_tracker_id_destroy(id); + goto error; + } + ret = cmd_track_id(cmd_ctx->session, cmd_ctx->lsm->u.id_tracker.tracker_type, - cmd_ctx->lsm->domain.type, &id); - free(id.string); + cmd_ctx->lsm->domain.type, id); + lttng_tracker_id_destroy(id); break; } case LTTNG_UNTRACK_ID: { - struct lttng_tracker_id id; + struct lttng_tracker_id *id = NULL; + enum lttng_tracker_id_status status; + + id = lttng_tracker_id_create(); - memset(&id, 0, sizeof(id)); - id.type = cmd_ctx->lsm->u.id_tracker.id_type; - switch (id.type) { + switch (cmd_ctx->lsm->u.id_tracker.id_type) { case LTTNG_ID_ALL: + status = lttng_tracker_id_set_all(id); break; case LTTNG_ID_VALUE: - id.value = cmd_ctx->lsm->u.id_tracker.u.value; + status = lttng_tracker_id_set_value( + id, cmd_ctx->lsm->u.id_tracker.u.value); break; case LTTNG_ID_STRING: { const size_t var_len = cmd_ctx->lsm->u.id_tracker.u.var_len; + char *string = NULL; - id.string = zmalloc(var_len); - if (!id.string) { + string = zmalloc(var_len); + if (!string) { ret = LTTNG_ERR_NOMEM; + lttng_tracker_id_destroy(id); goto error; } DBG("Receiving var len tracker id string from client"); - ret = lttcomm_recv_unix_sock(*sock, id.string, var_len); + ret = lttcomm_recv_unix_sock(*sock, string, var_len); if (ret <= 0) { DBG("Nothing received"); *sock_error = 1; - free(id.string); + lttng_tracker_id_destroy(id); + free(string); ret = LTTNG_ERR_INVALID; goto error; } - if (strnlen(id.string, var_len) != var_len - 1) { + if (strnlen(string, var_len) != var_len - 1) { DBG("String received as tracker ID is not NULL-terminated"); - free(id.string); + lttng_tracker_id_destroy(id); + free(string); ret = LTTNG_ERR_INVALID; goto error; } + status = lttng_tracker_id_set_string(id, string); + free(string); break; } default: + lttng_tracker_id_destroy(id); ret = LTTNG_ERR_INVALID; goto error; } + + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ERR("Invalid tracker id"); + lttng_tracker_id_destroy(id); + ret = LTTNG_ERR_INVALID; + goto error; + } + ret = cmd_untrack_id(cmd_ctx->session, cmd_ctx->lsm->u.id_tracker.tracker_type, - cmd_ctx->lsm->domain.type, &id); - free(id.string); + cmd_ctx->lsm->domain.type, id); + lttng_tracker_id_destroy(id); break; } case LTTNG_ENABLE_EVENT: @@ -1527,7 +1568,7 @@ error_add_context: case LTTNG_LIST_TRACKER_IDS: { struct lttcomm_tracker_command_header cmd_header; - struct lttng_tracker_id *ids = NULL; + struct lttng_tracker_id **ids = NULL; ssize_t nr_ids, i; struct lttng_dynamic_buffer buf; @@ -1543,44 +1584,60 @@ error_add_context: lttng_dynamic_buffer_init(&buf); for (i = 0; i < nr_ids; i++) { - struct lttng_tracker_id *id = &ids[i]; + struct lttng_tracker_id *id = ids[i]; struct lttcomm_tracker_id_header id_hdr; size_t var_data_len = 0; + enum lttng_tracker_id_status status; + const char *string; + int value; memset(&id_hdr, 0, sizeof(id_hdr)); - id_hdr.type = id->type; - switch (id->type) { + id_hdr.type = lttng_tracker_id_get_type(id); + switch (id_hdr.type) { case LTTNG_ID_ALL: break; case LTTNG_ID_VALUE: - id_hdr.u.value = id->value; + status = lttng_tracker_id_get_value(id, &value); + id_hdr.u.value = value; + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ret = LTTNG_ERR_INVALID; + goto error_list_tracker; + } break; case LTTNG_ID_STRING: + status = lttng_tracker_id_get_string( + id, &string); + if (status != LTTNG_TRACKER_ID_STATUS_OK) { + ret = LTTNG_ERR_INVALID; + goto error_list_tracker; + } + id_hdr.u.var_data_len = var_data_len = - strlen(id->string) + 1; + strlen(string) + 1; break; default: ret = LTTNG_ERR_INVALID; - goto error; + goto error_list_tracker; } ret = lttng_dynamic_buffer_append( &buf, &id_hdr, sizeof(id_hdr)); if (ret) { ret = LTTNG_ERR_NOMEM; - goto error; + goto error_list_tracker; } ret = lttng_dynamic_buffer_append( - &buf, id->string, var_data_len); + &buf, string, var_data_len); if (ret) { ret = LTTNG_ERR_NOMEM; - goto error; + goto error_list_tracker; } - free(id->string); } cmd_header.nb_tracker_id = nr_ids; ret = setup_lttng_msg(cmd_ctx, buf.data, buf.size, &cmd_header, sizeof(cmd_header)); + error_list_tracker: + lttng_tracker_ids_destroy(ids, nr_ids); free(ids); lttng_dynamic_buffer_reset(&buf); if (ret < 0) {