From 487b253b3ec9f187b4c1b425b246e8e74e5ac309 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Mon, 25 Mar 2013 14:41:22 -0400 Subject: [PATCH] Fix: session name max length was not handled correctly Fixes #435 Signed-off-by: David Goulet --- src/bin/lttng/commands/create.c | 8 +++++++- src/bin/lttng/commands/set_session.c | 7 +++++++ src/bin/lttng/conf.c | 9 ++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/bin/lttng/commands/create.c b/src/bin/lttng/commands/create.c index 5588d4267..b7d9af52e 100644 --- a/src/bin/lttng/commands/create.c +++ b/src/bin/lttng/commands/create.c @@ -183,7 +183,7 @@ static int create_session(void) int ret; char *session_name = NULL, *traces_path = NULL, *alloc_path = NULL; char *alloc_url = NULL, *url = NULL, datetime[16]; - char session_name_date[NAME_MAX], *print_str_url = NULL; + char session_name_date[NAME_MAX + 17], *print_str_url = NULL; time_t rawtime; struct tm *timeinfo; @@ -203,6 +203,12 @@ static int create_session(void) session_name = session_name_date; DBG("Auto session name set to %s", session_name_date); } else { + if (strlen(opt_session_name) > NAME_MAX) { + ERR("Session name too long. Length must be lower or equal to %d", + NAME_MAX); + ret = LTTNG_ERR_SESSION_FAIL; + goto error; + } if (strncmp(opt_session_name, DEFAULT_SESSION_NAME, strlen(DEFAULT_SESSION_NAME)) == 0 && strlen(opt_session_name) == strlen(DEFAULT_SESSION_NAME)) { diff --git a/src/bin/lttng/commands/set_session.c b/src/bin/lttng/commands/set_session.c index a428aed16..1f79d6cf0 100644 --- a/src/bin/lttng/commands/set_session.c +++ b/src/bin/lttng/commands/set_session.c @@ -60,6 +60,13 @@ static int set_session(void) { int ret = CMD_SUCCESS; + if (opt_session_name && strlen(opt_session_name) > NAME_MAX) { + ERR("Session name too long. Length must be lower or equal to %d", + NAME_MAX); + ret = CMD_ERROR; + goto error; + } + ret = config_init(opt_session_name); if (ret < 0) { ERR("Unable to set session name"); diff --git a/src/bin/lttng/conf.c b/src/bin/lttng/conf.c index 7439c1cdc..b6632fcb1 100644 --- a/src/bin/lttng/conf.c +++ b/src/bin/lttng/conf.c @@ -40,6 +40,7 @@ char *config_get_file_path(char *path) ret = asprintf(&file_path, "%s/%s", path, CONFIG_FILENAME); if (ret < 0) { ERR("Fail allocating config file path"); + file_path = NULL; } return file_path; @@ -248,14 +249,16 @@ found: int config_add_session_name(char *path, char *name) { int ret; - char session_name[NAME_MAX]; + char *attr = "session="; + /* Max name len accepted plus attribute's len and the NULL byte. */ + char session_name[NAME_MAX + strlen(attr) + 1]; /* * With GNU C < 2.1, snprintf returns -1 if the target buffer is too small; * With GNU C >= 2.1, snprintf returns the required size (excluding closing null) */ - ret = snprintf(session_name, NAME_MAX, "session=%s\n", name); - if ((ret < 0) || (ret >= NAME_MAX)) { + ret = snprintf(session_name, sizeof(session_name), "%s%s\n", attr, name); + if (ret < 0) { ret = -1; goto error; } -- 2.34.1