[svn-commits] eliel: branch group/data_api_gsoc2009 r209710 - /team/group/data_api_gsoc2009...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Jul 31 16:49:04 CDT 2009


Author: eliel
Date: Fri Jul 31 16:48:53 2009
New Revision: 209710

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=209710
Log:
Fix a leak in the data_search mechanism.
(there is still a leak when trying to destroy the returned tree).


Modified:
    team/group/data_api_gsoc2009/main/data.c

Modified: team/group/data_api_gsoc2009/main/data.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/data_api_gsoc2009/main/data.c?view=diff&rev=209710&r1=209709&r2=209710
==============================================================================
--- team/group/data_api_gsoc2009/main/data.c (original)
+++ team/group/data_api_gsoc2009/main/data.c Fri Jul 31 16:48:53 2009
@@ -804,31 +804,23 @@
 	const char *path)
 {
 	char *rpath, *node_name;
-	struct ast_data_search *child, *ret = NULL;
+	struct ast_data_search *child = NULL;
+	struct ao2_container *current = parent;
 
 	rpath = ast_strdupa(path);
 
 	node_name = next_node_name(&rpath);
-	if (!node_name) {
-		/* no more nodes to create. */
-		return NULL;
-	}
-
-	child = data_search_find(parent, node_name);
-
-	if (!child) {
-		/* nodes without handler are non-terminal nodes. */
-		child = data_search_add_child(parent, node_name);
-	}
-
-	if (rpath) {
-		ret = data_search_create(child->children, rpath);
-		if (ret) {
-			ao2_ref(child, -1);
-		}
-	}
-
-	return ret ? ret : child;
+	while (node_name) {
+		child = data_search_find(current, node_name);
+		if (!child) {
+			child = data_search_add_child(current, node_name);
+		}
+		ao2_ref(child, -1);
+		current = child->children;
+		node_name = next_node_name(&rpath);
+	}
+
+	return child;
 }
 
 /*!
@@ -923,8 +915,6 @@
 			child->cmp_type = cmp_type;
 			child->value = ast_strdup(ast_str_buffer(value));
 		}
-
-		ao2_ref(child, -1);
 	}
 
 	ast_free(name);
@@ -1004,25 +994,29 @@
 static struct ast_data_search *data_search_get_node(const struct ast_data_search *node,
 	const char *path)
 {
-	char *savepath;
-	struct ast_data_search *child;
+	char *savepath, *node_name;
+	struct ast_data_search *child, *current = (struct ast_data_search *) node;
 
 	if (!node) {
 		return NULL;
 	}
 
-	if (!path) {
-		return (struct ast_data_search *) node;
-	}
-
 	savepath = ast_strdupa(path);
-
-	child = data_search_find(node->children, next_node_name(&savepath));
-	if (!child) {
-		return NULL;
-	}
-
-	return data_search_get_node(child, savepath);
+	node_name = next_node_name(&savepath);
+
+	while (node_name) {
+		child = data_search_find(current->children, node_name);
+		if (current != node) {
+			ao2_ref(current, -1);
+		}
+		if (!child) {
+			return NULL;
+		};
+		current = child;
+		node_name = next_node_name(&savepath);
+	}
+
+	return current;
 }
 
 int ast_data_search_cmp_string(const struct ast_data_search *root, const char *name,
@@ -1355,11 +1349,6 @@
 	/* release the temporary created node used for searching. */
 	ao2_ref(find_node, -1);
 
-	/* do not increment the reference counter, we are not using it. */
-	if (found) {
-		ao2_ref(found, -1);
-	}
-
 	return found;
 }
 
@@ -1374,21 +1363,28 @@
 static struct ast_data *data_result_get_node(struct ast_data *node,
 	const char *path)
 {
-	char *savepath;
-	struct ast_data *child;
-
-	if (!path) {
-		return node;
-	}
+	char *savepath, *node_name;
+	struct ast_data *child, *current = node;
 
 	savepath = ast_strdupa(path);
-
-	child = data_result_find_child(node, next_node_name(&savepath));
-	if (!child) {
-		return NULL;
-	}
-
-	return data_result_get_node(child, savepath);
+	node_name = next_node_name(&savepath);
+
+	while (node_name) {
+		child = data_result_find_child(current, node_name);
+		if (current != node) {
+			ao2_ref(current, -1);
+		}
+		if (!child) {
+			return NULL;
+		}
+		current = child;
+		node_name = next_node_name(&savepath);
+	}
+
+	/* do not increment the refcount of the returned object. */
+	ao2_ref(current, -1);
+
+	return current;
 }
 
 /*!
@@ -2070,21 +2066,23 @@
 	}
 
 	while ((res = ao2_iterator_next(&iterator->internal_iterator))) {
+		/* if there is no node name pattern specified, return
+		 * the next node. */
 		if (!iterator->pattern) {
-			/* if there is no node name pattern specified, return
-			 * the next node. */
-			break;
-		}
-
+			break;
+		}
+
+		/* if the pattern is a regular expression, check if this node
+		 * matches. */
 		if (iterator->is_pattern && !regexec(&(iterator->regex_pattern),
 			res->name, 0, NULL, 0)) {
 			break;
 		}
 
+		/* if there is a pattern specified, check if this node matches
+		 * the wanted node names. */
 		if (!iterator->is_pattern &&
 			(iterator->pattern && !strcasecmp(res->name, iterator->pattern))) {
-			/* if there is a pattern specified, check if this node matches
-			 * the wanted node names. */
 			break;
 		}
 




More information about the svn-commits mailing list