[asterisk-commits] dvossel: trunk r271905 - /trunk/main/manager.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jun 22 12:57:32 CDT 2010


Author: dvossel
Date: Tue Jun 22 12:57:28 2010
New Revision: 271905

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=271905
Log:
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.


Modified:
    trunk/main/manager.c

Modified: trunk/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/manager.c?view=diff&rev=271905&r1=271904&r2=271905
==============================================================================
--- trunk/main/manager.c (original)
+++ trunk/main/manager.c Tue Jun 22 12:57:28 2010
@@ -1243,10 +1243,15 @@
 		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 @@
 	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 @@
 	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"));




More information about the asterisk-commits mailing list