[PATCH 1/5] Fixed a memory leak in the divelist when moving with the keyboard

Lubomir I. Ivanov neolit123 at gmail.com
Wed Feb 20 17:07:18 PST 2013


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

There were some small leaks before here, related to gtk_tree_iter_copy(),
but there is another one in select_next_dive():
nextiter = gtk_tree_iter_copy(iter);

This now requires a SJ near the epilog where we do the memory cleanup.
Lets call this similar label consistently "free_iter" between
select_prev_dive and select_next_dive.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---

BTW, the GTK docs suggest:
"This function is not intended for use in applications, because you can
just copy the structs by value GtkTreeIter new_iter = iter;"

so perhaps gtk_tree_iter_copy() can be made redundant, completely if that
works OK for us.

---
 divelist.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/divelist.c b/divelist.c
index da82116..75d525e 100644
--- a/divelist.c
+++ b/divelist.c
@@ -2729,11 +2729,11 @@ void select_next_dive(void)
 	if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter)) {
 		if (!gtk_tree_model_iter_parent(MODEL(dive_list), nextiter, iter)) {
 			/* we're at the last top level node */
-			return;
+			goto free_iter;
 		}
 		if (!gtk_tree_model_iter_next(MODEL(dive_list), nextiter)) {
 			/* last trip */
-			return;
+			goto free_iter;
 		}
 	}
 	gtk_tree_model_get(MODEL(dive_list), nextiter, DIVE_INDEX, &idx, -1);
@@ -2741,9 +2741,12 @@ void select_next_dive(void)
 		/* need the first child */
 		parent = gtk_tree_iter_copy(nextiter);
 		if (! gtk_tree_model_iter_children(MODEL(dive_list), nextiter, parent))
-			return;
+			goto free_iter;
 	}
 	go_to_iter(selection, nextiter);
+free_iter:
+	if (nextiter)
+		gtk_tree_iter_free(nextiter);
 	if (parent)
 		gtk_tree_iter_free(parent);
 	gtk_tree_iter_free(iter);
@@ -2763,27 +2766,27 @@ void select_prev_dive(void)
 	if (!gtk_tree_path_prev(treepath)) {
 		if (!gtk_tree_model_iter_parent(MODEL(dive_list), &previter, iter))
 			/* we're at the last top level node */
-			goto free_path;
+			goto free_iter;
 		gtk_tree_path_free(treepath);
 		treepath = gtk_tree_model_get_path(MODEL(dive_list), &previter);
 		if (!gtk_tree_path_prev(treepath))
 			/* first trip */
-			goto free_path;
+			goto free_iter;
 		if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
-			goto free_path;
+			goto free_iter;
 	}
 	if (!gtk_tree_model_get_iter(MODEL(dive_list), &previter, treepath))
-		goto free_path;
+		goto free_iter;
 	gtk_tree_model_get(MODEL(dive_list), &previter, DIVE_INDEX, &idx, -1);
 	if (idx < 0) {
 		/* need the last child */
 		parent = gtk_tree_iter_copy(&previter);
 		if (! gtk_tree_model_iter_nth_child(MODEL(dive_list), &previter, parent,
 				gtk_tree_model_iter_n_children(MODEL(dive_list), parent) - 1))
-			goto free_path;
+			goto free_iter;
 	}
 	go_to_iter(selection, &previter);
-free_path:
+free_iter:
 	gtk_tree_path_free(treepath);
 	if (parent)
 		gtk_tree_iter_free(parent);
-- 
1.7.11.msysgit.0



More information about the subsurface mailing list