[lttng-dev] [lttng-tools] Fix: channel name with '.' and '/' brings problems
Philippe Proulx
eeppeliteloop at gmail.com
Wed Nov 26 22:32:12 EST 2014
This patch ensures:
1. A channel name does not contain any '/' character, since
relative paths may be injected in the channel name
otherwise (knowing that the channel name is eventually
part of a file name)
2. A channel name does not start with a '.' character, since
trace readers (Babeltrace is one of them) could interpret
files starting with a dot as hidden files and ignore
them when opening the CTF trace
Fixes: #751
Signed-off-by: Philippe Proulx <eeppeliteloop at gmail.com>
---
src/bin/lttng/commands/enable_channels.c | 38 +++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/src/bin/lttng/commands/enable_channels.c b/src/bin/lttng/commands/enable_channels.c
index f8272e9..e6cce49 100644
--- a/src/bin/lttng/commands/enable_channels.c
+++ b/src/bin/lttng/commands/enable_channels.c
@@ -275,11 +275,39 @@ static int enable_channel(char *session_name)
/* Strip channel list (format: chan1,chan2,...) */
channel_name = strtok(opt_channels, ",");
while (channel_name != NULL) {
- /* Copy channel name and normalize it */
+ /* Copy channel name, sanitize and normalize it */
strncpy(chan.name, channel_name, NAME_MAX);
chan.name[NAME_MAX - 1] = '\0';
- DBG("Enabling channel %s", channel_name);
+ char *src, *dst;
+ int got_first = 0;
+
+ for (src = dst = chan.name; *src != '\0'; ++src) {
+ *dst = *src;
+
+ /*
+ * Channel name could be used in file names, so remove
+ * invalid '/'
+ */
+ if (*dst != '/') {
+ /*
+ * Remove starting dots since this could create
+ * file names starting with dots, and trace
+ * readers could interpret them as hidden files
+ * and ignore them.
+ */
+ if (*dst != '.') {
+ got_first = 1;
+ dst++;
+ } else if (got_first) {
+ dst++;
+ }
+ }
+ }
+
+ *dst = '\0';
+
+ DBG("Enabling channel %s", chan.name);
ret = lttng_enable_channel(handle, &chan);
if (ret < 0) {
@@ -288,19 +316,19 @@ static int enable_channel(char *session_name)
case LTTNG_ERR_KERN_CHAN_EXIST:
case LTTNG_ERR_UST_CHAN_EXIST:
case LTTNG_ERR_CHAN_EXIST:
- WARN("Channel %s: %s (session %s)", channel_name,
+ WARN("Channel %s: %s (session %s)", chan.name,
lttng_strerror(ret), session_name);
warn = 1;
break;
default:
- ERR("Channel %s: %s (session %s)", channel_name,
+ ERR("Channel %s: %s (session %s)", chan.name,
lttng_strerror(ret), session_name);
error = 1;
break;
}
} else {
MSG("%s channel %s enabled for session %s",
- get_domain_str(dom.type), channel_name, session_name);
+ get_domain_str(dom.type), chan.name, session_name);
success = 1;
}
--
2.1.3
More information about the lttng-dev
mailing list