LTTNG_ERR_EXCLUSION_INVAL = 110, /* Invalid event exclusion data */
LTTNG_ERR_EXCLUSION_NOMEM = 111, /* Lack of memory while processing event exclusions */
LTTNG_ERR_INVALID_EVENT_NAME = 112, /* Invalid event name */
+ LTTNG_ERR_INVALID_CHANNEL_NAME = 113, /* Invalid channel name */
/* MUST be last element */
LTTNG_ERR_NR, /* Last element */
#define _GNU_SOURCE
#include <assert.h>
+#include <string.h>
#include <inttypes.h>
#include <urcu/list.h>
#include <urcu/uatomic.h>
int ret;
struct ltt_ust_session *usess = session->ust_session;
struct lttng_ht *chan_ht;
+ size_t len;
assert(session);
assert(attr);
assert(domain);
+ len = strnlen(attr->name, sizeof(attr->name));
+
+ /* Validate channel name */
+ if (attr->name[0] == '.' ||
+ memchr(attr->name, '/', len) != NULL) {
+ ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
+ goto end;
+ }
+
DBG("Enabling channel %s for session %s", attr->name, session->name);
rcu_read_lock();
error:
rcu_read_unlock();
+end:
return ret;
}
/* Strip channel list (format: chan1,chan2,...) */
channel_name = strtok(opt_channels, ",");
while (channel_name != NULL) {
- /* Copy channel name and normalize it */
- strncpy(chan.name, channel_name, NAME_MAX);
- chan.name[NAME_MAX - 1] = '\0';
+ /* Validate channel name's length */
+ if (strlen(channel_name) >= NAME_MAX) {
+ ERR("Channel name is too long (max. %zu characters)",
+ sizeof(chan.name) - 1);
+ error = 1;
+ goto skip_enable;
+ }
+
+ /* Copy channel name */
+ strcpy(chan.name, channel_name);
DBG("Enabling channel %s", channel_name);
lttng_strerror(ret), session_name);
warn = 1;
break;
+ case LTTNG_ERR_INVALID_CHANNEL_NAME:
+ ERR("Invalid channel name: \"%s\". "
+ "Channel names may not start with '.', and "
+ "may not contain '/'.", channel_name);
+ error = 1;
+ break;
default:
ERR("Channel %s: %s (session %s)", channel_name,
lttng_strerror(ret), session_name);
success = 1;
}
+skip_enable:
if (lttng_opt_mi) {
/* Mi print the channel element and leave it open */
ret = mi_lttng_channel(writer, &chan, 1);
[ ERROR_INDEX(LTTNG_ERR_MI_IO_FAIL) ] = "IO error while writing MI output",
[ ERROR_INDEX(LTTNG_ERR_MI_NOT_IMPLEMENTED) ] = "Mi feature not implemented",
[ ERROR_INDEX(LTTNG_ERR_INVALID_EVENT_NAME) ] = "Invalid event name",
+ [ ERROR_INDEX(LTTNG_ERR_INVALID_CHANNEL_NAME) ] = "Invalid channel name",
/* Last element */
[ ERROR_INDEX(LTTNG_ERR_NR) ] = "Unknown error code"