diff options
author | Tiago Cunha <tcunha@gmx.com> | 2012-08-31 09:22:08 +0000 |
---|---|---|
committer | Tiago Cunha <tcunha@gmx.com> | 2012-08-31 09:22:08 +0000 |
commit | 56e37487a81f07b4c8f409e72dea6c5b746de4b3 (patch) | |
tree | 224cea806ff14efaa70bff628a268c5572a5c7ea | |
parent | 674545f7e6fc703a809d60b572e1a99d0777d6f2 (diff) | |
download | rtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.tar.gz rtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.tar.bz2 rtmux-56e37487a81f07b4c8f409e72dea6c5b746de4b3.zip |
Sync OpenBSD patchset 1165:
Fix up window reference counting and don't crash if the rename timer
fires while the window is dead but still referenced. Fixes problem
reported by Michael Scholz.
-rw-r--r-- | names.c | 3 | ||||
-rw-r--r-- | notify.c | 3 | ||||
-rw-r--r-- | tmux.h | 1 | ||||
-rw-r--r-- | window.c | 19 |
4 files changed, 18 insertions, 8 deletions
@@ -50,6 +50,9 @@ window_name_callback(unused int fd, unused short events, void *data) struct window *w = data; char *name, *wname; + if (w->active == NULL) + return; + if (!options_get_number(&w->options, "automatic-rename")) { if (event_initialized(&w->name_timer)) event_del(&w->name_timer); @@ -124,7 +124,8 @@ notify_drain(void) if (ne->session != NULL) ne->session->references--; if (ne->window != NULL) - ne->window->references--; + window_remove_ref(ne->window); + TAILQ_REMOVE(¬ify_queue, ne, entry); free(ne); } @@ -2126,6 +2126,7 @@ struct window_pane *window_pane_find_down(struct window_pane *); struct window_pane *window_pane_find_left(struct window_pane *); struct window_pane *window_pane_find_right(struct window_pane *); void window_set_name(struct window *, const char *); +void window_remove_ref(struct window *); void winlink_clear_flags(struct winlink *); void window_mode_attrs(struct grid_cell *, struct options *); @@ -179,13 +179,8 @@ winlink_remove(struct winlinks *wwl, struct winlink *wl) free(wl->status_text); free(wl); - if (w != NULL) { - if (w->references == 0) - fatal("bad reference count"); - w->references--; - if (w->references == 0) - window_destroy(w); - } + if (w != NULL) + window_remove_ref(w); } struct winlink * @@ -360,6 +355,16 @@ window_destroy(struct window *w) } void +window_remove_ref(struct window *w) +{ + if (w->references == 0) + fatal("bad reference count"); + w->references--; + if (w->references == 0) + window_destroy(w); +} + +void window_set_name(struct window *w, const char *new_name) { free(w->name); |