projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix RCU-related hangs: incorrect lttng_ht_destroy use
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
session.c
diff --git
a/src/bin/lttng-sessiond/session.c
b/src/bin/lttng-sessiond/session.c
index bcdd78d50e68b921f47ceb4038311c625aee875d..b6b24b76c3f9ae28cec31d3c9e3224351647a2ef 100644
(file)
--- a/
src/bin/lttng-sessiond/session.c
+++ b/
src/bin/lttng-sessiond/session.c
@@
-45,7
+45,7
@@
static struct ltt_session_list ltt_session_list = {
.head = CDS_LIST_HEAD_INIT(ltt_session_list.head),
.lock = PTHREAD_MUTEX_INITIALIZER,
static struct ltt_session_list ltt_session_list = {
.head = CDS_LIST_HEAD_INIT(ltt_session_list.head),
.lock = PTHREAD_MUTEX_INITIALIZER,
- .
count
= 0,
+ .
next_uuid
= 0,
};
/*
};
/*
@@
-56,8
+56,10
@@
static struct ltt_session_list ltt_session_list = {
*/
static unsigned int add_session_list(struct ltt_session *ls)
{
*/
static unsigned int add_session_list(struct ltt_session *ls)
{
+ assert(ls);
+
cds_list_add(&ls->list, <t_session_list.head);
cds_list_add(&ls->list, <t_session_list.head);
- return
++ltt_session_list.count
;
+ return
ltt_session_list.next_uuid++
;
}
/*
}
/*
@@
-67,11
+69,9
@@
static unsigned int add_session_list(struct ltt_session *ls)
*/
static void del_session_list(struct ltt_session *ls)
{
*/
static void del_session_list(struct ltt_session *ls)
{
+ assert(ls);
+
cds_list_del(&ls->list);
cds_list_del(&ls->list);
- /* Sanity check */
- if (ltt_session_list.count > 0) {
- ltt_session_list.count--;
- }
}
/*
}
/*
@@
-103,6
+103,8
@@
void session_unlock_list(void)
*/
void session_lock(struct ltt_session *session)
{
*/
void session_lock(struct ltt_session *session)
{
+ assert(session);
+
pthread_mutex_lock(&session->lock);
}
pthread_mutex_lock(&session->lock);
}
@@
-111,6
+113,8
@@
void session_lock(struct ltt_session *session)
*/
void session_unlock(struct ltt_session *session)
{
*/
void session_unlock(struct ltt_session *session)
{
+ assert(session);
+
pthread_mutex_unlock(&session->lock);
}
pthread_mutex_unlock(&session->lock);
}
@@
-123,6
+127,8
@@
struct ltt_session *session_find_by_name(char *name)
{
struct ltt_session *iter;
{
struct ltt_session *iter;
+ assert(name);
+
DBG2("Trying to find session by name %s", name);
cds_list_for_each_entry(iter, <t_session_list.head, list) {
DBG2("Trying to find session by name %s", name);
cds_list_for_each_entry(iter, <t_session_list.head, list) {
@@
-141,66
+147,48
@@
found:
* Delete session from the session list and free the memory.
*
* Return -1 if no session is found. On success, return 1;
* Delete session from the session list and free the memory.
*
* Return -1 if no session is found. On success, return 1;
+ * Should *NOT* be called with RCU read-side lock held.
*/
int session_destroy(struct ltt_session *session)
{
/* Safety check */
*/
int session_destroy(struct ltt_session *session)
{
/* Safety check */
- if (session == NULL) {
- ERR("Session pointer was null on session destroy");
- return LTTCOMM_OK;
- }
+ assert(session);
DBG("Destroying session %s", session->name);
del_session_list(session);
pthread_mutex_destroy(&session->lock);
DBG("Destroying session %s", session->name);
del_session_list(session);
pthread_mutex_destroy(&session->lock);
+
+ consumer_destroy_output(session->consumer);
free(session);
free(session);
- return LTT
COMM
_OK;
+ return LTT
NG
_OK;
}
/*
* Create a brand new session and add it to the session list.
*/
}
/*
* Create a brand new session and add it to the session list.
*/
-int session_create(char *name,
char *path,
uid_t uid, gid_t gid)
+int session_create(char *name, uid_t uid, gid_t gid)
{
int ret;
struct ltt_session *new_session;
{
int ret;
struct ltt_session *new_session;
- new_session = session_find_by_name(name);
- if (new_session != NULL) {
- ret = LTTCOMM_EXIST_SESS;
- goto error_exist;
- }
-
/* Allocate session data structure */
new_session = zmalloc(sizeof(struct ltt_session));
if (new_session == NULL) {
PERROR("zmalloc");
/* Allocate session data structure */
new_session = zmalloc(sizeof(struct ltt_session));
if (new_session == NULL) {
PERROR("zmalloc");
- ret = LTT
COMM
_FATAL;
+ ret = LTT
NG_ERR
_FATAL;
goto error_malloc;
}
/* Define session name */
if (name != NULL) {
if (snprintf(new_session->name, NAME_MAX, "%s", name) < 0) {
goto error_malloc;
}
/* Define session name */
if (name != NULL) {
if (snprintf(new_session->name, NAME_MAX, "%s", name) < 0) {
- ret = LTT
COMM
_FATAL;
+ ret = LTT
NG_ERR
_FATAL;
goto error_asprintf;
}
} else {
ERR("No session name given");
goto error_asprintf;
}
} else {
ERR("No session name given");
- ret = LTTCOMM_FATAL;
- goto error;
- }
-
- /* Define session system path */
- if (path != NULL) {
- if (snprintf(new_session->path, PATH_MAX, "%s", path) < 0) {
- ret = LTTCOMM_FATAL;
- goto error_asprintf;
- }
- } else {
- ERR("No session path given");
- ret = LTTCOMM_FATAL;
+ ret = LTTNG_ERR_FATAL;
goto error;
}
goto error;
}
@@
-214,34
+202,40
@@
int session_create(char *name, char *path, uid_t uid, gid_t gid)
new_session->uid = uid;
new_session->gid = gid;
new_session->uid = uid;
new_session->gid = gid;
- ret = run_as_mkdir_recursive(new_session->path, S_IRWXU | S_IRWXG,
- new_session->uid, new_session->gid);
- if (ret < 0) {
- if (ret != -EEXIST) {
- ERR("Trace directory creation error");
- ret = LTTCOMM_CREATE_DIR_FAIL;
- goto error;
- }
- }
-
/* Add new session to the session list */
session_lock_list();
new_session->id = add_session_list(new_session);
session_unlock_list();
/* Add new session to the session list */
session_lock_list();
new_session->id = add_session_list(new_session);
session_unlock_list();
- DBG("Tracing session %s created in %s with ID %u by UID %d GID %d",
- name, path, new_session->id,
- new_session->uid, new_session->gid);
+ /*
+ * Consumer is let to NULL since the create_session_uri command will set it
+ * up and, if valid, assign it to the session.
+ */
- return LTTCOMM_OK;
+ DBG("Tracing session %s created with ID %u by UID %d GID %d", name,
+ new_session->id, new_session->uid, new_session->gid);
+
+ return LTTNG_OK;
error:
error_asprintf:
error:
error_asprintf:
- if (new_session != NULL) {
- free(new_session);
- }
+ free(new_session);
-error_exist:
error_malloc:
return ret;
}
error_malloc:
return ret;
}
+
+/*
+ * Check if the UID or GID match the session. Root user has access to all
+ * sessions.
+ */
+int session_access_ok(struct ltt_session *session, uid_t uid, gid_t gid)
+{
+ assert(session);
+
+ if (uid != session->uid && gid != session->gid && uid != 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
This page took
0.02584 seconds
and
4
git commands to generate.