aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-22 17:57:28 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-22 17:57:28 +0000
commitc7483699476ed8647c3f72ad54f3ea1b147f28a3 (patch)
tree1e1adfe86f6fa189059c1a7f68b6476062d27179 /main
parent40f9324880038ab1534201f4ec5c18b0d4716343 (diff)
minor fixes for white/black event filters
This fixes a ref count leak in event filters and checks for a filter container allocation failure during session creation. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@271905 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/manager.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/main/manager.c b/main/manager.c
index ab234de76..8ba243847 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1243,10 +1243,15 @@ static void session_destructor(void *obj)
ast_atomic_fetchadd_int(&eqe->usecount, -1);
}
- ao2_t_callback(session->whitefilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all white filters");
- ao2_t_callback(session->blackfilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all black filters");
- ao2_t_ref(session->whitefilters, -1 , "decrement ref for white container, should be last one");
- ao2_t_ref(session->blackfilters, -1 , "decrement ref for black container, should be last one");
+ if (session->whitefilters) {
+ ao2_t_callback(session->whitefilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all white filters");
+ ao2_t_ref(session->whitefilters, -1 , "decrement ref for white container, should be last one");
+ }
+
+ if (session->blackfilters) {
+ ao2_t_callback(session->blackfilters, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL, "unlink all black filters");
+ ao2_t_ref(session->blackfilters, -1 , "decrement ref for black container, should be last one");
+ }
}
/*! \brief Allocate manager session structure and add it to the list of sessions */
@@ -1257,6 +1262,17 @@ static struct mansession_session *build_mansession(struct sockaddr_in sin)
if (!(newsession = ao2_alloc(sizeof(*newsession), session_destructor))) {
return NULL;
}
+
+ if (!(newsession->whitefilters = ao2_container_alloc(1, NULL, NULL))) {
+ ao2_ref(newsession, -1);
+ return NULL;
+ }
+
+ if (!(newsession->blackfilters = ao2_container_alloc(1, NULL, NULL))) {
+ ao2_ref(newsession, -1); /* session_destructor will cleanup the other filter */
+ return NULL;
+ }
+
newsession->fd = -1;
newsession->waiting_thread = AST_PTHREADT_NULL;
newsession->writetimeout = 100;
@@ -2270,23 +2286,21 @@ static int authenticate(struct mansession *s, const struct message *m)
s->session->readperm = user->readperm;
s->session->writeperm = user->writeperm;
s->session->writetimeout = user->writetimeout;
- s->session->whitefilters = ao2_container_alloc(1, NULL, NULL);
- s->session->blackfilters = ao2_container_alloc(1, NULL, NULL);
- if (s->session->whitefilters && s->session->blackfilters) {
- filter_iter = ao2_iterator_init(user->whitefilters, 0);
- while ((regex_filter = ao2_iterator_next(&filter_iter))) {
- ao2_t_link(s->session->whitefilters, regex_filter, "add white user filter to session");
- }
- ao2_iterator_destroy(&filter_iter);
- filter_iter = ao2_iterator_init(user->blackfilters, 0);
- while ((regex_filter = ao2_iterator_next(&filter_iter))) {
- ao2_t_link(s->session->blackfilters, regex_filter, "add black user filter to session");
- }
- ao2_iterator_destroy(&filter_iter);
- } else {
- ast_log(LOG_WARNING, "Allocation for filters failed, no filtering will occur.\n");
+ filter_iter = ao2_iterator_init(user->whitefilters, 0);
+ while ((regex_filter = ao2_iterator_next(&filter_iter))) {
+ ao2_t_link(s->session->whitefilters, regex_filter, "add white user filter to session");
+ ao2_t_ref(regex_filter, -1, "remove iterator ref");
+ }
+ ao2_iterator_destroy(&filter_iter);
+
+ filter_iter = ao2_iterator_init(user->blackfilters, 0);
+ while ((regex_filter = ao2_iterator_next(&filter_iter))) {
+ ao2_t_link(s->session->blackfilters, regex_filter, "add black user filter to session");
+ ao2_t_ref(regex_filter, -1, "remove iterator ref");
}
+ ao2_iterator_destroy(&filter_iter);
+
s->session->sessionstart = time(NULL);
s->session->sessionstart_tv = ast_tvnow();
set_eventmask(s, astman_get_header(m, "Events"));