summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2023-11-25 12:02:58 +0000
committerVincent Sanders <vince@kyllikki.org>2023-11-25 12:02:58 +0000
commit41de6cb6f8ee73a712e305f8c1b6d34090a24523 (patch)
tree520e36ec76d5b4165b10f5df27a36433b4cd43da
parentd448436cdb75a9d38a85a6a8bb9c9f6f3d3b85a2 (diff)
downloadnetsurf-41de6cb6f8ee73a712e305f8c1b6d34090a24523.tar.gz
netsurf-41de6cb6f8ee73a712e305f8c1b6d34090a24523.tar.bz2
Ensure the current scaffold remains valid
When a scaffold was being destroyed the currently selected scaffold could become a reference to a destroyed object. This would result in crashes subsequently when the current scaffold was referenced. The change is simply to ensure the selected scaffold is changed to something valid during destruction.
-rw-r--r--frontends/gtk/scaffolding.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index 71c96a8ba..f9d4f6d67 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -193,6 +193,18 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data)
nsgtk_local_history_hide();
+ /* ensure scaffolding being destroyed is not current */
+ if (scaf_current == gs) {
+ scaf_current = NULL;
+ /* attempt to select nearest scaffold instead of just selecting the first */
+ if (gs->prev != NULL) {
+ scaf_current = gs->prev;
+ } else if (gs->next != NULL) {
+ scaf_current = gs->next;
+ }
+ }
+
+ /* remove scaffolding from list */
if (gs->prev != NULL) {
gs->prev->next = gs->next;
} else {