diff options
author | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-03-05 12:32:04 +0000 |
---|---|---|
committer | Maciej Stachowiak <mstachow@src.gnome.org> | 2000-03-05 12:32:04 +0000 |
commit | 57ee999c6d9730becd2d460eedb5aa757808a255 (patch) | |
tree | 0c712410e766aaebbe167a1edc4763f41b80d5b6 | |
parent | aa399a9b1dde9b19e444c014846a4b8d235a116e (diff) | |
download | nautilus-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-20000414 | 12 | ||||
-rw-r--r-- | src/nautilus-navigation-window.c | 6 | ||||
-rw-r--r-- | src/nautilus-navigation-window.h | 3 | ||||
-rw-r--r-- | src/nautilus-object-window.c | 6 | ||||
-rw-r--r-- | src/nautilus-object-window.h | 3 | ||||
-rw-r--r-- | src/nautilus-spatial-window.c | 6 | ||||
-rw-r--r-- | src/nautilus-spatial-window.h | 3 | ||||
-rw-r--r-- | src/nautilus-window-manage-views.c | 24 | ||||
-rw-r--r-- | src/nautilus-window.c | 6 | ||||
-rw-r--r-- | src/nautilus-window.h | 3 | ||||
-rw-r--r-- | src/ntl-window-msgs.c | 24 | ||||
-rw-r--r-- | src/ntl-window.c | 6 | ||||
-rw-r--r-- | src/ntl-window.h | 3 |
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 |