*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <limits.h>
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <urcu.h>
+#include <dirent.h>
+#include <sys/types.h>
#include <common/common.h>
#include <common/sessiond-comm/sessiond-comm.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.
*
* 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;
del_session_list(session);
pthread_mutex_destroy(&session->lock);
- consumer_destroy_output(session->consumer);
+ consumer_output_put(session->consumer);
snapshot_destroy(&session->snapshot);
free(session);
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;