From e1b624d005769d1a2e9eb39fee63c73c6395fd76 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 12 Jan 2021 17:41:54 -0500 Subject: [PATCH] Fix: liblttng-ctl: unreported truncations when copying strings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit gcc 10.2 reports a large number of string truncation warning in liblttng-ctl. Replace the uses of lttng_ctl_copy_string() util by lttng_strncpy() (handling the null source case when applicable) and report the truncations when they occur. Example gcc warning: lttng-ctl.c:86:3: warning: ‘strncpy’ output may be truncated copying 254 bytes from a string of length 254 [-Wstringop-truncation] Signed-off-by: Jérémie Galarneau Change-Id: Icca5f4c2490c6796b451999d7694db8597bae719 --- src/lib/lttng-ctl/channel.c | 7 +- src/lib/lttng-ctl/load.c | 6 +- src/lib/lttng-ctl/lttng-ctl-health.c | 26 ++- src/lib/lttng-ctl/lttng-ctl-helper.h | 1 - src/lib/lttng-ctl/lttng-ctl.c | 270 +++++++++++++++++++-------- src/lib/lttng-ctl/rotate.c | 22 ++- src/lib/lttng-ctl/save.c | 8 +- src/lib/lttng-ctl/snapshot.c | 102 +++++++--- src/lib/lttng-ctl/tracker.c | 43 ++++- 9 files changed, 357 insertions(+), 128 deletions(-) diff --git a/src/lib/lttng-ctl/channel.c b/src/lib/lttng-ctl/channel.c index a4e910e1d..868e8aa68 100644 --- a/src/lib/lttng-ctl/channel.c +++ b/src/lib/lttng-ctl/channel.c @@ -164,9 +164,14 @@ struct lttng_notification_channel *lttng_notification_channel_create( } if (is_root || is_in_tracing_group) { - lttng_ctl_copy_string(sock_path, + ret = lttng_strncpy(sock_path, DEFAULT_GLOBAL_NOTIFICATION_CHANNEL_UNIX_SOCK, LTTNG_PATH_MAX); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + ret = lttcomm_connect_unix_sock(sock_path); if (ret >= 0) { fd = ret; diff --git a/src/lib/lttng-ctl/load.c b/src/lib/lttng-ctl/load.c index 28e1dbac6..db9bfe0bf 100644 --- a/src/lib/lttng-ctl/load.c +++ b/src/lib/lttng-ctl/load.c @@ -230,8 +230,12 @@ int lttng_load_session_attr_set_input_url( } /* Copy string plus the NULL terminated byte. */ - lttng_ctl_copy_string(attr->input_url, uris[0].dst.path, + ret = lttng_strncpy(attr->input_url, uris[0].dst.path, sizeof(attr->input_url)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } end: error: diff --git a/src/lib/lttng-ctl/lttng-ctl-health.c b/src/lib/lttng-ctl/lttng-ctl-health.c index 9ae3d4174..dc1516db5 100644 --- a/src/lib/lttng-ctl/lttng-ctl-health.c +++ b/src/lib/lttng-ctl/lttng-ctl-health.c @@ -94,7 +94,7 @@ const char **thread_name[NR_HEALTH_COMPONENT] = { /* * Set health socket path. * - * Returns 0 on success or -ENOMEM. + * Returns 0 on success or a negative errno. */ static int set_health_socket_path(struct lttng_health *lh, @@ -143,10 +143,10 @@ int set_health_socket_path(struct lttng_health *lh, uid = getuid(); if (uid == 0 || tracing_group) { - lttng_ctl_copy_string(lh->health_sock_path, + ret = lttng_strncpy(lh->health_sock_path, global_str, sizeof(lh->health_sock_path)); - return 0; + return ret == 0 ? 0 : -EINVAL; } /* @@ -218,20 +218,30 @@ struct lttng_health * struct lttng_health *lttng_health_create_relayd(const char *path) { - struct lttng_health *lh; + int ret; + struct lttng_health *lh = NULL; if (!path) { - return NULL; + goto error; } lh = lttng_health_create(HEALTH_COMPONENT_RELAYD, NR_HEALTH_RELAYD_TYPES); if (!lh) { - return NULL; + goto error; } - lttng_ctl_copy_string(lh->health_sock_path, path, - sizeof(lh->health_sock_path)); + + ret = lttng_strncpy(lh->health_sock_path, path ?: "", + sizeof(lh->health_sock_path)); + if (ret) { + goto error; + } + return lh; + +error: + free(lh); + return NULL; } void lttng_health_destroy(struct lttng_health *lh) diff --git a/src/lib/lttng-ctl/lttng-ctl-helper.h b/src/lib/lttng-ctl/lttng-ctl-helper.h index d1c5aa865..b96ed56e4 100644 --- a/src/lib/lttng-ctl/lttng-ctl-helper.h +++ b/src/lib/lttng-ctl/lttng-ctl-helper.h @@ -20,7 +20,6 @@ */ /* Copy helper functions. */ -void lttng_ctl_copy_string(char *dst, const char *src, size_t len); void lttng_ctl_copy_lttng_domain(struct lttng_domain *dst, struct lttng_domain *src); diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index a295667fe..38df4cb7b 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -76,21 +76,6 @@ int lttng_opt_quiet; int lttng_opt_verbose; int lttng_opt_mi; -/* - * Copy string from src to dst and enforce null terminated byte. - */ -LTTNG_HIDDEN -void lttng_ctl_copy_string(char *dst, const char *src, size_t len) -{ - if (src && dst) { - strncpy(dst, src, len); - /* Enforce the NULL terminated byte */ - dst[len - 1] = '\0'; - } else if (dst) { - dst[0] = '\0'; - } -} - /* * Copy domain to lttcomm_session_msg domain. * @@ -402,8 +387,13 @@ static int set_session_daemon_path(void) } if ((uid == 0) || in_tgroup) { - lttng_ctl_copy_string(sessiond_sock_path, - DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, sizeof(sessiond_sock_path)); + const int ret = lttng_strncpy(sessiond_sock_path, + DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, + sizeof(sessiond_sock_path)); + + if (ret) { + goto error; + } } if (uid != 0) { @@ -714,6 +704,7 @@ end: struct lttng_handle *lttng_create_handle(const char *session_name, struct lttng_domain *domain) { + int ret; struct lttng_handle *handle = NULL; handle = zmalloc(sizeof(struct lttng_handle)); @@ -723,8 +714,11 @@ struct lttng_handle *lttng_create_handle(const char *session_name, } /* Copy session name */ - lttng_ctl_copy_string(handle->session_name, session_name, - sizeof(handle->session_name)); + ret = lttng_strncpy(handle->session_name, session_name ? : "", + sizeof(handle->session_name)); + if (ret) { + goto error; + } /* Copy lttng domain or leave initialized to 0. */ if (domain) { @@ -733,6 +727,9 @@ struct lttng_handle *lttng_create_handle(const char *session_name, end: return handle; +error: + free(handle); + return NULL; } /* @@ -751,22 +748,35 @@ void lttng_destroy_handle(struct lttng_handle *handle) int lttng_register_consumer(struct lttng_handle *handle, const char *socket_path) { + int ret; struct lttcomm_session_msg lsm; if (handle == NULL || socket_path == NULL) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_REGISTER_CONSUMER; - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + COPY_DOMAIN_PACKED(lsm.domain, handle->domain); - lttng_ctl_copy_string(lsm.u.reg.path, socket_path, - sizeof(lsm.u.reg.path)); + ret = lttng_strncpy(lsm.u.reg.path, socket_path, + sizeof(lsm.u.reg.path)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -776,19 +786,27 @@ int lttng_register_consumer(struct lttng_handle *handle, */ int lttng_start_tracing(const char *session_name) { + int ret; struct lttcomm_session_msg lsm; if (session_name == NULL) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_START_TRACE; - lttng_ctl_copy_string(lsm.session.name, session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -800,14 +818,19 @@ static int _lttng_stop_tracing(const char *session_name, int wait) struct lttcomm_session_msg lsm; if (session_name == NULL) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto error; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_STOP_TRACE; - lttng_ctl_copy_string(lsm.session.name, session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } ret = lttng_ctl_ask_sessiond(&lsm, NULL); if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) { @@ -884,17 +907,20 @@ int lttng_add_context(struct lttng_handle *handle, lsm.cmd_type = LTTNG_ADD_CONTEXT; /* If no channel name, send empty string. */ - if (channel_name == NULL) { - lttng_ctl_copy_string(lsm.u.context.channel_name, "", - sizeof(lsm.u.context.channel_name)); - } else { - lttng_ctl_copy_string(lsm.u.context.channel_name, channel_name, - sizeof(lsm.u.context.channel_name)); + ret = lttng_strncpy(lsm.u.context.channel_name, channel_name ?: "", + sizeof(lsm.u.context.channel_name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; } COPY_DOMAIN_PACKED(lsm.domain, handle->domain); - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) { size_t provider_len, ctx_len; @@ -1090,25 +1116,30 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, memset(&lsm, 0, sizeof(lsm)); /* If no channel name, send empty string. */ - if (channel_name == NULL) { - lttng_ctl_copy_string(lsm.u.enable.channel_name, "", - sizeof(lsm.u.enable.channel_name)); - } else { - lttng_ctl_copy_string(lsm.u.enable.channel_name, channel_name, - sizeof(lsm.u.enable.channel_name)); + ret = lttng_strncpy(lsm.u.enable.channel_name, channel_name ?: "", + sizeof(lsm.u.enable.channel_name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; } lsm.cmd_type = LTTNG_ENABLE_EVENT; if (ev->name[0] == '\0') { - /* Enable all events */ - lttng_ctl_copy_string(ev->name, "*", sizeof(ev->name)); + /* Enable all events. */ + ret = lttng_strncpy(ev->name, "*", sizeof(ev->name)); + assert(ret == 0); } COPY_DOMAIN_PACKED(lsm.domain, handle->domain); memcpy(&lsm.u.enable.event, ev, sizeof(lsm.u.enable.event)); - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + lsm.u.enable.exclusion_count = exclusion_count; lsm.u.enable.bytecode_len = 0; @@ -1312,12 +1343,11 @@ int lttng_disable_event_ext(struct lttng_handle *handle, memset(&lsm, 0, sizeof(lsm)); /* If no channel name, send empty string. */ - if (channel_name == NULL) { - lttng_ctl_copy_string(lsm.u.disable.channel_name, "", - sizeof(lsm.u.disable.channel_name)); - } else { - lttng_ctl_copy_string(lsm.u.disable.channel_name, channel_name, - sizeof(lsm.u.disable.channel_name)); + ret = lttng_strncpy(lsm.u.disable.channel_name, channel_name ?: "", + sizeof(lsm.u.disable.channel_name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; } lsm.cmd_type = LTTNG_DISABLE_EVENT; @@ -1325,8 +1355,13 @@ int lttng_disable_event_ext(struct lttng_handle *handle, COPY_DOMAIN_PACKED(lsm.domain, handle->domain); memcpy(&lsm.u.disable.event, ev, sizeof(lsm.u.disable.event)); - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + lsm.u.disable.bytecode_len = 0; /* @@ -1447,13 +1482,21 @@ ask_sessiond: int lttng_disable_event(struct lttng_handle *handle, const char *name, const char *channel_name) { + int ret; struct lttng_event ev; memset(&ev, 0, sizeof(ev)); ev.loglevel = -1; ev.type = LTTNG_EVENT_ALL; - lttng_ctl_copy_string(ev.name, name, sizeof(ev.name)); - return lttng_disable_event_ext(handle, &ev, channel_name, NULL); + ret = lttng_strncpy(ev.name, name ?: "", sizeof(ev.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + ret = lttng_disable_event_ext(handle, &ev, channel_name, NULL); +end: + return ret; } struct lttng_channel *lttng_channel_create(struct lttng_domain *domain) @@ -1524,6 +1567,7 @@ void lttng_channel_destroy(struct lttng_channel *channel) int lttng_enable_channel(struct lttng_handle *handle, struct lttng_channel *in_chan) { + int ret; struct lttcomm_session_msg lsm; size_t total_buffer_size_needed_per_cpu = 0; @@ -1574,10 +1618,16 @@ int lttng_enable_channel(struct lttng_handle *handle, lsm.cmd_type = LTTNG_ENABLE_CHANNEL; COPY_DOMAIN_PACKED(lsm.domain, handle->domain); - lttng_ctl_copy_string(lsm.session.name, handle->session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -1586,6 +1636,7 @@ int lttng_enable_channel(struct lttng_handle *handle, */ int lttng_disable_channel(struct lttng_handle *handle, const char *name) { + int ret; struct lttcomm_session_msg lsm; /* Safety check. Both are mandatory. */ @@ -1597,15 +1648,25 @@ int lttng_disable_channel(struct lttng_handle *handle, const char *name) lsm.cmd_type = LTTNG_DISABLE_CHANNEL; - lttng_ctl_copy_string(lsm.u.disable.channel_name, name, + ret = lttng_strncpy(lsm.u.disable.channel_name, name, sizeof(lsm.u.disable.channel_name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } COPY_DOMAIN_PACKED(lsm.domain, handle->domain); - lttng_ctl_copy_string(lsm.session.name, handle->session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, handle->session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -2083,6 +2144,7 @@ end: int lttng_set_session_shm_path(const char *session_name, const char *shm_path) { + int ret; struct lttcomm_session_msg lsm; if (session_name == NULL) { @@ -2092,12 +2154,23 @@ int lttng_set_session_shm_path(const char *session_name, memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SET_SESSION_SHM_PATH; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); - lttng_ctl_copy_string(lsm.u.set_shm_path.shm_path, shm_path, + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + ret = lttng_strncpy(lsm.u.set_shm_path.shm_path, shm_path ?: "", sizeof(lsm.u.set_shm_path.shm_path)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -2113,21 +2186,28 @@ int lttng_list_domains(const char *session_name, struct lttcomm_session_msg lsm; if (session_name == NULL) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto error; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_LIST_DOMAINS; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } ret = lttng_ctl_ask_sessiond(&lsm, (void**) domains); if (ret < 0) { - return ret; + goto error; } return ret / sizeof(struct lttng_domain); +error: + return ret; } /* @@ -2153,8 +2233,12 @@ int lttng_list_channels(struct lttng_handle *handle, memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_LIST_CHANNELS; - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } COPY_DOMAIN_PACKED(lsm.domain, handle->domain); @@ -2222,10 +2306,20 @@ int lttng_list_events(struct lttng_handle *handle, lttng_payload_init(&payload_copy); lsm.cmd_type = LTTNG_LIST_EVENTS; - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); - lttng_ctl_copy_string(lsm.u.list.channel_name, channel_name, + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + ret = lttng_strncpy(lsm.u.list.channel_name, channel_name, sizeof(lsm.u.list.channel_name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + COPY_DOMAIN_PACKED(lsm.domain, handle->domain); ret = lttng_ctl_ask_sessiond_payload(&lsm_view, &payload); @@ -2799,20 +2893,27 @@ int lttng_set_consumer_url(struct lttng_handle *handle, struct lttng_uri *uris = NULL; if (handle == NULL || (control_url == NULL && data_url == NULL)) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto error; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SET_CONSUMER_URI; - lttng_ctl_copy_string(lsm.session.name, handle->session_name, + ret = lttng_strncpy(lsm.session.name, handle->session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + COPY_DOMAIN_PACKED(lsm.domain, handle->domain); size = uri_parse_str_urls(control_url, data_url, &uris); if (size < 0) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto error; } lsm.u.uri.size = size; @@ -2821,6 +2922,7 @@ int lttng_set_consumer_url(struct lttng_handle *handle, sizeof(struct lttng_uri) * size, NULL); free(uris); +error: return ret; } @@ -2871,8 +2973,12 @@ int lttng_data_pending(const char *session_name) memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_DATA_PENDING; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } ret = lttng_ctl_ask_sessiond(&lsm, (void **) &pending); if (ret < 0) { @@ -2910,8 +3016,12 @@ int lttng_regenerate_metadata(const char *session_name) memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_REGENERATE_METADATA; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } ret = lttng_ctl_ask_sessiond(&lsm, NULL); if (ret < 0) { @@ -2948,8 +3058,12 @@ int lttng_regenerate_statedump(const char *session_name) memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_REGENERATE_STATEDUMP; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } ret = lttng_ctl_ask_sessiond(&lsm, NULL); if (ret < 0) { diff --git a/src/lib/lttng-ctl/rotate.c b/src/lib/lttng-ctl/rotate.c index 2dbaa46a3..1002e230b 100644 --- a/src/lib/lttng-ctl/rotate.c +++ b/src/lib/lttng-ctl/rotate.c @@ -219,8 +219,11 @@ int lttng_rotate_session(const char *session_name, memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_ROTATE_SESSION; - lttng_ctl_copy_string(lsm.session.name, session_name, - sizeof(lsm.session.name)); + + ret = lttng_strncpy(lsm.session.name, session_name, + sizeof(lsm.session.name)); + /* Source length already validated. */ + assert(ret == 0); ret = lttng_ctl_ask_sessiond(&lsm, (void **) &rotate_return); if (ret <= 0) { @@ -282,8 +285,10 @@ enum lttng_rotation_status lttng_rotation_update_schedule( memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_ROTATION_SET_SCHEDULE; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + /* Source length already validated. */ + assert(ret == 0); lsm.u.rotation_set_schedule.type = (uint32_t) schedule->type; switch (schedule->type) { @@ -366,10 +371,19 @@ int get_schedules(const char *session_name, struct lttng_rotation_schedules *schedules = NULL; struct lttng_rotation_schedule *periodic = NULL, *size = NULL; + if (!session_name) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SESSION_LIST_ROTATION_SCHEDULES; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } ret = lttng_ctl_ask_sessiond(&lsm, (void **) &schedules_comm); if (ret < 0) { diff --git a/src/lib/lttng-ctl/save.c b/src/lib/lttng-ctl/save.c index 90ab94187..7afac450d 100644 --- a/src/lib/lttng-ctl/save.c +++ b/src/lib/lttng-ctl/save.c @@ -134,8 +134,12 @@ int lttng_save_session_attr_set_output_url( } /* Copy string plus the NULL terminated byte. */ - lttng_ctl_copy_string(attr->configuration_url, uris[0].dst.path, - sizeof(attr->configuration_url)); + ret = lttng_strncpy(attr->configuration_url, uris[0].dst.path, + sizeof(attr->configuration_url)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } end: error: diff --git a/src/lib/lttng-ctl/snapshot.c b/src/lib/lttng-ctl/snapshot.c index 2d7725c96..f7b4741ca 100644 --- a/src/lib/lttng-ctl/snapshot.c +++ b/src/lib/lttng-ctl/snapshot.c @@ -29,26 +29,33 @@ int lttng_snapshot_add_output(const char *session_name, struct lttcomm_lttng_output_id *reply; if (!session_name || !output) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SNAPSHOT_ADD_OUTPUT; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + memcpy(&lsm.u.snapshot_output.output, output, sizeof(lsm.u.snapshot_output.output)); ret = lttng_ctl_ask_sessiond(&lsm, (void **) &reply); if (ret < 0) { - return ret; + goto end; } output->id = reply->id; free(reply); - - return 0; + ret = 0; +end: + return ret; } /* @@ -59,21 +66,30 @@ int lttng_snapshot_add_output(const char *session_name, int lttng_snapshot_del_output(const char *session_name, struct lttng_snapshot_output *output) { + int ret; struct lttcomm_session_msg lsm; if (!session_name || !output) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SNAPSHOT_DEL_OUTPUT; - lttng_ctl_copy_string(lsm.session.name, session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + memcpy(&lsm.u.snapshot_output.output, output, sizeof(lsm.u.snapshot_output.output)); - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -98,8 +114,12 @@ int lttng_snapshot_list_output(const char *session_name, memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SNAPSHOT_LIST_OUTPUT; - lttng_ctl_copy_string(lsm.session.name, session_name, - sizeof(lsm.session.name)); + ret = lttng_strncpy(lsm.session.name, session_name, + sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto error; + } new_list = zmalloc(sizeof(*new_list)); if (!new_list) { @@ -179,17 +199,23 @@ void lttng_snapshot_output_list_destroy(struct lttng_snapshot_output_list *list) int lttng_snapshot_record(const char *session_name, struct lttng_snapshot_output *output, int wait) { + int ret; struct lttcomm_session_msg lsm; if (!session_name) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_SNAPSHOT_RECORD; - lttng_ctl_copy_string(lsm.session.name, session_name, + ret = lttng_strncpy(lsm.session.name, session_name, sizeof(lsm.session.name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } /* * Not having an output object will use the default one of the session that @@ -202,8 +228,9 @@ int lttng_snapshot_record(const char *session_name, } /* The wait param is ignored. */ - - return lttng_ctl_ask_sessiond(&lsm, NULL); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; } /* @@ -294,34 +321,61 @@ int lttng_snapshot_output_set_size(uint64_t size, int lttng_snapshot_output_set_name(const char *name, struct lttng_snapshot_output *output) { + int ret; + if (!output || !name) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } - lttng_ctl_copy_string(output->name, name, sizeof(output->name)); - return 0; + ret = lttng_strncpy(output->name, name, sizeof(output->name)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + +end: + return ret; } int lttng_snapshot_output_set_ctrl_url(const char *url, struct lttng_snapshot_output *output) { + int ret; + if (!output || !url) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } - lttng_ctl_copy_string(output->ctrl_url, url, sizeof(output->ctrl_url)); - return 0; + ret = lttng_strncpy(output->ctrl_url, url, sizeof(output->ctrl_url)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + +end: + return ret; } int lttng_snapshot_output_set_data_url(const char *url, struct lttng_snapshot_output *output) { + int ret; + if (!output || !url) { - return -LTTNG_ERR_INVALID; + ret = -LTTNG_ERR_INVALID; + goto end; } - lttng_ctl_copy_string(output->data_url, url, sizeof(output->data_url)); - return 0; + ret = lttng_strncpy(output->data_url, url, sizeof(output->data_url)); + if (ret) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + +end: + return ret; } int lttng_snapshot_output_set_local_path(const char *path, diff --git a/src/lib/lttng-ctl/tracker.c b/src/lib/lttng-ctl/tracker.c index 4f720ead8..4eae95fc5 100644 --- a/src/lib/lttng-ctl/tracker.c +++ b/src/lib/lttng-ctl/tracker.c @@ -96,7 +96,7 @@ lttng_process_attr_tracker_handle_get_tracking_policy( enum lttng_tracking_policy *policy) { void *reply = NULL; - int reply_ret; + int reply_ret, copy_ret; enum lttng_process_attr_tracker_handle_status status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_OK; struct lttcomm_session_msg lsm = { @@ -108,8 +108,13 @@ lttng_process_attr_tracker_handle_get_tracking_policy( goto end; } - lttng_ctl_copy_string(lsm.session.name, tracker->session_name, + copy_ret = lttng_strncpy(lsm.session.name, tracker->session_name, sizeof(lsm.session.name)); + if (copy_ret) { + status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID; + goto end; + } + lsm.domain.type = tracker->domain; lsm.u.process_attr_tracker_get_tracking_policy.process_attr = (int32_t) tracker->process_attr; @@ -138,7 +143,7 @@ lttng_process_attr_tracker_handle_set_tracking_policy( const struct lttng_process_attr_tracker_handle *tracker, enum lttng_tracking_policy policy) { - int reply_ret; + int reply_ret, copy_ret; enum lttng_process_attr_tracker_handle_status status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_OK; struct lttcomm_session_msg lsm = { @@ -150,8 +155,13 @@ lttng_process_attr_tracker_handle_set_tracking_policy( goto end; } - lttng_ctl_copy_string(lsm.session.name, tracker->session_name, - sizeof(lsm.session.name)); + copy_ret = lttng_strncpy(lsm.session.name, tracker->session_name, + sizeof(lsm.session.name)); + if (copy_ret) { + status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID; + goto end; + } + lsm.domain.type = tracker->domain; lsm.u.process_attr_tracker_set_tracking_policy.process_attr = (int32_t) tracker->process_attr; @@ -192,8 +202,13 @@ end: goto end; \ } \ \ - lttng_ctl_copy_string(lsm.session.name, tracker->session_name, \ + ret = lttng_strncpy(lsm.session.name, tracker->session_name, \ sizeof(lsm.session.name)); \ + if (ret) { \ + status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID; \ + goto end; \ + } \ + \ lsm.domain.type = tracker->domain; \ lsm.u.process_attr_tracker_add_remove_include_value \ .process_attr = \ @@ -251,8 +266,13 @@ end: goto end; \ } \ \ - lttng_ctl_copy_string(lsm.session.name, tracker->session_name, \ + ret = lttng_strncpy(lsm.session.name, tracker->session_name, \ sizeof(lsm.session.name)); \ + if (ret) { \ + status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID; \ + goto end; \ + } \ + \ lsm.domain.type = tracker->domain; \ lsm.u.process_attr_tracker_add_remove_include_value \ .process_attr = \ @@ -348,7 +368,7 @@ lttng_process_attr_tracker_handle_get_inclusion_set( const struct lttng_process_attr_values **values) { void *reply = NULL; - int reply_ret; + int reply_ret, copy_ret; enum lttng_process_attr_tracker_handle_status status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_OK; struct lttcomm_session_msg lsm = { @@ -365,8 +385,13 @@ lttng_process_attr_tracker_handle_get_inclusion_set( lttng_process_attr_values_destroy(tracker->inclusion_set); tracker->inclusion_set = NULL; - lttng_ctl_copy_string(lsm.session.name, tracker->session_name, + copy_ret = lttng_strncpy(lsm.session.name, tracker->session_name, sizeof(lsm.session.name)); + if (copy_ret) { + status = LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID; + goto end; + } + lsm.domain.type = tracker->domain; lsm.u.process_attr_tracker_get_tracking_policy.process_attr = (int32_t) tracker->process_attr; -- 2.34.1