summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Stachowiak <mstachow@src.gnome.org>2000-03-05 12:32:04 +0000
committerMaciej Stachowiak <mstachow@src.gnome.org>2000-03-05 12:32:04 +0000
commit57ee999c6d9730becd2d460eedb5aa757808a255 (patch)
tree0c712410e766aaebbe167a1edc4763f41b80d5b6
parentaa399a9b1dde9b19e444c014846a4b8d235a116e (diff)
downloadnautilus-57ee999c6d9730becd2d460eedb5aa757808a255.tar.gz
Handle freeing of window->ni in a fancier way to avoid double-free
* src/ntl-window-msgs.c (nautilus_window_update_internals): Handle freeing of window->ni in a fancier way to avoid double-free problems which were causing crashes after some amount of view switching and navigation. It might leak memory but it's the only obvious way to avoid crashing. * src/ntl-window.c (nautilus_window_destroy): Likewise to avoid crashing on exit. * src/ntl-window.h (Nautilus_NavigationInfo_free): Prototype this function.
-rw-r--r--ChangeLog-2000041412
-rw-r--r--src/nautilus-navigation-window.c6
-rw-r--r--src/nautilus-navigation-window.h3
-rw-r--r--src/nautilus-object-window.c6
-rw-r--r--src/nautilus-object-window.h3
-rw-r--r--src/nautilus-spatial-window.c6
-rw-r--r--src/nautilus-spatial-window.h3
-rw-r--r--src/nautilus-window-manage-views.c24
-rw-r--r--src/nautilus-window.c6
-rw-r--r--src/nautilus-window.h3
-rw-r--r--src/ntl-window-msgs.c24
-rw-r--r--src/ntl-window.c6
-rw-r--r--src/ntl-window.h3
13 files changed, 83 insertions, 22 deletions
diff --git a/ChangeLog-20000414 b/ChangeLog-20000414
index f9916fdc9..2fd930873 100644
--- a/ChangeLog-20000414
+++ b/ChangeLog-20000414
@@ -1,3 +1,15 @@
+2000-03-05 Maciej Stachowiak <mjs@eazel.com>
+
+ * src/ntl-window-msgs.c (nautilus_window_update_internals): Handle
+ freeing of window->ni in a fancier way to avoid double-free
+ problems which were causing crashes after some amount of view
+ switching and navigation. It might leak memory but it's the only
+ obvious way to avoid crashing.
+ * src/ntl-window.c (nautilus_window_destroy): Likewise to avoid
+ crashing on exit.
+ * src/ntl-window.h (Nautilus_NavigationInfo_free): Prototype this
+ function.
+
2000-03-04 Maciej Stachowiak <mjs@eazel.com>
* nautilus-clean.sh: Simple shell script to check if any of the
diff --git a/src/nautilus-navigation-window.c b/src/nautilus-navigation-window.c
index 876647dcf..92866a31e 100644
--- a/src/nautilus-navigation-window.c
+++ b/src/nautilus-navigation-window.c
@@ -639,12 +639,14 @@ nautilus_window_get_arg (GtkObject *object,
}
}
-static void nautilus_window_destroy (NautilusWindow *window)
+static void
+nautilus_window_destroy (NautilusWindow *window)
{
NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass);
g_slist_free(window->meta_views);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
CORBA_free(window->si);
g_slist_foreach(window->back_list, (GFunc)gtk_object_unref, NULL);
g_slist_foreach(window->forward_list, (GFunc)gtk_object_unref, NULL);
diff --git a/src/nautilus-navigation-window.h b/src/nautilus-navigation-window.h
index 73de38aa7..026f29e59 100644
--- a/src/nautilus-navigation-window.h
+++ b/src/nautilus-navigation-window.h
@@ -133,4 +133,7 @@ void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow);
void nautilus_bookmarks_exiting (void);
+void Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni);
+
+
#endif
diff --git a/src/nautilus-object-window.c b/src/nautilus-object-window.c
index 876647dcf..92866a31e 100644
--- a/src/nautilus-object-window.c
+++ b/src/nautilus-object-window.c
@@ -639,12 +639,14 @@ nautilus_window_get_arg (GtkObject *object,
}
}
-static void nautilus_window_destroy (NautilusWindow *window)
+static void
+nautilus_window_destroy (NautilusWindow *window)
{
NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass);
g_slist_free(window->meta_views);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
CORBA_free(window->si);
g_slist_foreach(window->back_list, (GFunc)gtk_object_unref, NULL);
g_slist_foreach(window->forward_list, (GFunc)gtk_object_unref, NULL);
diff --git a/src/nautilus-object-window.h b/src/nautilus-object-window.h
index 73de38aa7..026f29e59 100644
--- a/src/nautilus-object-window.h
+++ b/src/nautilus-object-window.h
@@ -133,4 +133,7 @@ void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow);
void nautilus_bookmarks_exiting (void);
+void Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni);
+
+
#endif
diff --git a/src/nautilus-spatial-window.c b/src/nautilus-spatial-window.c
index 876647dcf..92866a31e 100644
--- a/src/nautilus-spatial-window.c
+++ b/src/nautilus-spatial-window.c
@@ -639,12 +639,14 @@ nautilus_window_get_arg (GtkObject *object,
}
}
-static void nautilus_window_destroy (NautilusWindow *window)
+static void
+nautilus_window_destroy (NautilusWindow *window)
{
NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass);
g_slist_free(window->meta_views);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
CORBA_free(window->si);
g_slist_foreach(window->back_list, (GFunc)gtk_object_unref, NULL);
g_slist_foreach(window->forward_list, (GFunc)gtk_object_unref, NULL);
diff --git a/src/nautilus-spatial-window.h b/src/nautilus-spatial-window.h
index 73de38aa7..026f29e59 100644
--- a/src/nautilus-spatial-window.h
+++ b/src/nautilus-spatial-window.h
@@ -133,4 +133,7 @@ void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow);
void nautilus_bookmarks_exiting (void);
+void Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni);
+
+
#endif
diff --git a/src/nautilus-window-manage-views.c b/src/nautilus-window-manage-views.c
index 7cf8e745d..63d832c2b 100644
--- a/src/nautilus-window-manage-views.c
+++ b/src/nautilus-window-manage-views.c
@@ -179,6 +179,16 @@ Nautilus_NavigationInfo__copy(Nautilus_NavigationInfo *dest_ni, Nautilus_Navigat
dest_ni->self_originated = CORBA_FALSE;
}
+
+void
+Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni)
+{
+ if (ni != NULL) {
+ ni->content_view = CORBA_OBJECT_NIL;
+ CORBA_free(ni);
+ }
+}
+
/* Handle the changes for the NautilusWindow itself. */
static void
nautilus_window_update_internals(NautilusWindow *window, NautilusNavigationInfo *loci)
@@ -255,7 +265,9 @@ nautilus_window_update_internals(NautilusWindow *window, NautilusNavigationInfo
newni = Nautilus_NavigationInfo__alloc();
Nautilus_NavigationInfo__copy(newni, &loci->navinfo);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
+
window->ni = newni;
CORBA_free(window->si);
@@ -516,13 +528,13 @@ nautilus_window_load_content_view(NautilusWindow *window,
else
new_view = window->content_view;
- if(new_view && NAUTILUS_IS_VIEW(new_view))
+ if(new_view && NAUTILUS_IS_VIEW (new_view))
{
- gtk_object_ref(GTK_OBJECT(new_view));
-
- navinfo->content_view = nautilus_view_get_client_objref(new_view);
+ gtk_object_ref (GTK_OBJECT (new_view));
+
+ navinfo->content_view = nautilus_view_get_client_objref (new_view);
- nautilus_view_set_active_errors(new_view, TRUE);
+ nautilus_view_set_active_errors (new_view, TRUE);
}
else
new_view = NULL;
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 876647dcf..92866a31e 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -639,12 +639,14 @@ nautilus_window_get_arg (GtkObject *object,
}
}
-static void nautilus_window_destroy (NautilusWindow *window)
+static void
+nautilus_window_destroy (NautilusWindow *window)
{
NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass);
g_slist_free(window->meta_views);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
CORBA_free(window->si);
g_slist_foreach(window->back_list, (GFunc)gtk_object_unref, NULL);
g_slist_foreach(window->forward_list, (GFunc)gtk_object_unref, NULL);
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 73de38aa7..026f29e59 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -133,4 +133,7 @@ void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow);
void nautilus_bookmarks_exiting (void);
+void Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni);
+
+
#endif
diff --git a/src/ntl-window-msgs.c b/src/ntl-window-msgs.c
index 7cf8e745d..63d832c2b 100644
--- a/src/ntl-window-msgs.c
+++ b/src/ntl-window-msgs.c
@@ -179,6 +179,16 @@ Nautilus_NavigationInfo__copy(Nautilus_NavigationInfo *dest_ni, Nautilus_Navigat
dest_ni->self_originated = CORBA_FALSE;
}
+
+void
+Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni)
+{
+ if (ni != NULL) {
+ ni->content_view = CORBA_OBJECT_NIL;
+ CORBA_free(ni);
+ }
+}
+
/* Handle the changes for the NautilusWindow itself. */
static void
nautilus_window_update_internals(NautilusWindow *window, NautilusNavigationInfo *loci)
@@ -255,7 +265,9 @@ nautilus_window_update_internals(NautilusWindow *window, NautilusNavigationInfo
newni = Nautilus_NavigationInfo__alloc();
Nautilus_NavigationInfo__copy(newni, &loci->navinfo);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
+
window->ni = newni;
CORBA_free(window->si);
@@ -516,13 +528,13 @@ nautilus_window_load_content_view(NautilusWindow *window,
else
new_view = window->content_view;
- if(new_view && NAUTILUS_IS_VIEW(new_view))
+ if(new_view && NAUTILUS_IS_VIEW (new_view))
{
- gtk_object_ref(GTK_OBJECT(new_view));
-
- navinfo->content_view = nautilus_view_get_client_objref(new_view);
+ gtk_object_ref (GTK_OBJECT (new_view));
+
+ navinfo->content_view = nautilus_view_get_client_objref (new_view);
- nautilus_view_set_active_errors(new_view, TRUE);
+ nautilus_view_set_active_errors (new_view, TRUE);
}
else
new_view = NULL;
diff --git a/src/ntl-window.c b/src/ntl-window.c
index 876647dcf..92866a31e 100644
--- a/src/ntl-window.c
+++ b/src/ntl-window.c
@@ -639,12 +639,14 @@ nautilus_window_get_arg (GtkObject *object,
}
}
-static void nautilus_window_destroy (NautilusWindow *window)
+static void
+nautilus_window_destroy (NautilusWindow *window)
{
NautilusWindowClass *klass = NAUTILUS_WINDOW_CLASS(GTK_OBJECT(window)->klass);
g_slist_free(window->meta_views);
- CORBA_free(window->ni);
+
+ Nautilus_NavigationInfo_free (window->ni);
CORBA_free(window->si);
g_slist_foreach(window->back_list, (GFunc)gtk_object_unref, NULL);
g_slist_foreach(window->forward_list, (GFunc)gtk_object_unref, NULL);
diff --git a/src/ntl-window.h b/src/ntl-window.h
index 73de38aa7..026f29e59 100644
--- a/src/ntl-window.h
+++ b/src/ntl-window.h
@@ -133,4 +133,7 @@ void nautilus_window_allow_stop (NautilusWindow *window, gboolean allow);
void nautilus_bookmarks_exiting (void);
+void Nautilus_NavigationInfo_free (Nautilus_NavigationInfo *ni);
+
+
#endif