#define _GNU_SOURCE
#include <limits.h>
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
.next_uuid = 0,
};
+/* These characters are forbidden in a session name. Used by validate_name. */
+static const char *forbidden_name_chars = "/";
+
+/*
+ * Validate the session name for forbidden characters.
+ *
+ * Return 0 on success else -1 meaning a forbidden char. has been found.
+ */
+static int validate_name(const char *name)
+{
+ int ret;
+ char *tok, *tmp_name;
+
+ assert(name);
+
+ tmp_name = strdup(name);
+ if (!tmp_name) {
+ /* ENOMEM here. */
+ ret = -1;
+ goto error;
+ }
+
+ tok = strpbrk(tmp_name, forbidden_name_chars);
+ if (tok) {
+ DBG("Session name %s contains a forbidden character", name);
+ /* Forbidden character has been found. */
+ ret = -1;
+ goto error;
+ }
+ ret = 0;
+
+error:
+ free(tmp_name);
+ return ret;
+}
+
/*
* Add a ltt_session structure to the global list.
*
* The caller MUST acquire the session list lock before.
* Returns the unique identifier for the session.
*/
-static unsigned int add_session_list(struct ltt_session *ls)
+static uint64_t add_session_list(struct ltt_session *ls)
{
assert(ls);
* NULL is returned. This must be called with the session lock held using
* session_lock_list and session_unlock_list.
*/
-struct ltt_session *session_find_by_name(char *name)
+struct ltt_session *session_find_by_name(const char *name)
{
struct ltt_session *iter;
goto error;
}
+ ret = validate_name(name);
+ if (ret < 0) {
+ ret = LTTNG_ERR_SESSION_INVALID_CHAR;
+ goto error;
+ }
+
+ ret = gethostname(new_session->hostname, sizeof(new_session->hostname));
+ if (ret < 0) {
+ if (errno == ENAMETOOLONG) {
+ new_session->hostname[sizeof(new_session->hostname) - 1] = '\0';
+ } else {
+ ret = LTTNG_ERR_FATAL;
+ goto error;
+ }
+ }
+
/* Init kernel session */
new_session->kernel_session = NULL;
new_session->ust_session = NULL;
* up and, if valid, assign it to the session.
*/
- DBG("Tracing session %s created with ID %u by UID %d GID %d", name,
- new_session->id, new_session->uid, new_session->gid);
+ DBG("Tracing session %s created with ID %" PRIu64 " by UID %d GID %d",
+ name, new_session->id, new_session->uid, new_session->gid);
return LTTNG_OK;