From a122a38eee71e4541bfca49cecb6ed3b4d824cfe Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Thu, 19 Apr 2001 13:00:29 +0000 Subject: [PATCH] (delete_kboard): Prevent a dangling reference from current_kboard to KB, which is freed. --- src/ChangeLog | 3 +++ src/keyboard.c | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index bf411ea416f..16ed4171305 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,8 @@ 2001-04-19 Gerd Moellmann + * keyboard.c (delete_kboard): Prevent a dangling reference + from current_kboard to KB, which is freed. + * process.c (wait_reading_process_input): Call record_asynch_buffer_change after running timers, to make read_key_sequence aware of buffer changes from under it. diff --git a/src/keyboard.c b/src/keyboard.c index 1d984be4fcc..a9dd324a381 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -10013,19 +10013,33 @@ wipe_kboard (kb) } #ifdef MULTI_KBOARD + +/* Free KB and memory referenced from it. */ + void delete_kboard (kb) - KBOARD *kb; + KBOARD *kb; { KBOARD **kbp; + for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard) if (*kbp == NULL) abort (); *kbp = kb->next_kboard; + + /* Prevent a dangling reference to KB. */ + if (kb == current_kboard) + { + current_kboard = SELECTED_FRAME ()->kboard; + if (current_kboard == kb) + abort (); + } + wipe_kboard (kb); xfree (kb); } -#endif + +#endif /* MULTI_KBOARD */ void init_keyboard () -- 2.39.2