Fix: liblttng-ctl comm: lttng_event_context is not packed
[lttng-tools.git] / src / lib / lttng-ctl / lttng-ctl.cpp
index 7539302428f668ff2af59ff26b0c99118d7e1efe..e671bae402c3d21927fc41ad17445a0778e192dc 100644 (file)
@@ -915,9 +915,10 @@ int lttng_add_context(struct lttng_handle *handle,
                const char *channel_name)
 {
        int ret;
-       size_t len = 0;
-       char *buf = NULL;
-       struct lttcomm_session_msg lsm;
+       struct lttcomm_session_msg lsm = { .cmd_type = LTTNG_ADD_CONTEXT };
+       struct lttng_payload payload;
+
+       lttng_payload_init(&payload);
 
        /* Safety check. Both are mandatory. */
        if (handle == NULL || ctx == NULL) {
@@ -925,8 +926,11 @@ int lttng_add_context(struct lttng_handle *handle,
                goto end;
        }
 
-       memset(&lsm, 0, sizeof(lsm));
-       lsm.cmd_type = LTTNG_ADD_CONTEXT;
+       ret = lttng_dynamic_buffer_set_size(&payload.buffer, sizeof(lsm));
+       if (ret) {
+               ret = -LTTNG_ERR_NOMEM;
+               goto end;
+       }
 
        /* If no channel name, send empty string. */
        ret = lttng_strncpy(lsm.u.context.channel_name, channel_name ?: "",
@@ -944,55 +948,33 @@ int lttng_add_context(struct lttng_handle *handle,
                goto end;
        }
 
-       if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
-               size_t provider_len, ctx_len;
-               const char *provider_name = ctx->u.app_ctx.provider_name;
-               const char *ctx_name = ctx->u.app_ctx.ctx_name;
-
-               if (!provider_name || !ctx_name) {
-                       ret = -LTTNG_ERR_INVALID;
-                       goto end;
-               }
+       ret = lttng_event_context_serialize(ctx, &payload);
+       if (ret) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
 
-               provider_len = strlen(provider_name);
-               if (provider_len == 0) {
-                       ret = -LTTNG_ERR_INVALID;
-                       goto end;
-               }
-               lsm.u.context.provider_name_len = provider_len;
+       lsm.u.context.length = payload.buffer.size - sizeof(lsm);
 
-               ctx_len = strlen(ctx_name);
-               if (ctx_len == 0) {
-                       ret = -LTTNG_ERR_INVALID;
-                       goto end;
-               }
-               lsm.u.context.context_name_len = ctx_len;
+       /* Update message header. */
+       memcpy(payload.buffer.data, &lsm, sizeof(lsm));
 
-               len = provider_len + ctx_len;
-               buf = (char *) zmalloc(len);
-               if (!buf) {
-                       ret = -LTTNG_ERR_NOMEM;
+       {
+               struct lttng_payload reply;
+               struct lttng_payload_view payload_view =
+                               lttng_payload_view_from_payload(&payload, 0,
+                               -1);
+
+               lttng_payload_init(&reply);
+               ret = lttng_ctl_ask_sessiond_payload(&payload_view, &reply);
+               lttng_payload_reset(&reply);
+               if (ret) {
                        goto end;
                }
-
-               memcpy(buf, provider_name, provider_len);
-               memcpy(buf + provider_len, ctx_name, ctx_len);
-       }
-       memcpy(&lsm.u.context.ctx, ctx, sizeof(struct lttng_event_context));
-
-       if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
-               /*
-                * Don't leak application addresses to the sessiond.
-                * This is only necessary when ctx is for an app ctx otherwise
-                * the values inside the union (type & config) are overwritten.
-                */
-               lsm.u.context.ctx.u.app_ctx.provider_name = NULL;
-               lsm.u.context.ctx.u.app_ctx.ctx_name = NULL;
        }
 
-       ret = lttng_ctl_ask_sessiond_varlen_no_cmd_header(&lsm, buf, len, NULL);
 end:
-       free(buf);
+       lttng_payload_reset(&payload);
        return ret;
 }
 
This page took 0.023834 seconds and 4 git commands to generate.